首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Numpy fast for循环

Numpy fast for循环
EN

Stack Overflow用户
提问于 2021-02-13 19:10:14
回答 2查看 33关注 0票数 0

我有一个名为"y“的列表,其中有8个形状为(180000 )的数值数组,现在我想创建一个新的数值数组"Collision”,其形状与计算y的​​不为0的数值的数量相同。请参见以下示例:

代码语言:javascript
运行
复制
import numpy as np
collisions = np.zeros(len(y[0]), dtype=np.uint8)
for yi in y:
    collisions[np.where(yi > 0)] += 1

这个函数的计算需要较长的时间。有没有更快的实现来做到这一点?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-13 19:20:18

我不确定为什么你的计算花了这么长的时间,希望这有助于澄清,例如你的数组列表是这样的:

代码语言:javascript
运行
复制
import numpy as np
y = [np.random.normal(0,1,180000) for i in range(8)]

运行你的代码,它工作得很好:

代码语言:javascript
运行
复制
collisions = np.zeros(len(y[0]), dtype=np.uint8)
for yi in y:
    collisions[np.where(yi > 0)] += 1

collisions
array([4, 2, 4, ..., 4, 4, 5], dtype=uint8)

你可以像这样做得更快一点,基本上把你的数组列表变成一个矩阵,然后计算一个>0的行和,但我看不出上面有什么问题:

代码语言:javascript
运行
复制
(np.array(y)>0).sum(axis=0)

array([4, 2, 4, ..., 4, 4, 5])
票数 0
EN

Stack Overflow用户

发布于 2021-02-13 19:33:12

我假设你正在寻找类似这样的东西:

代码语言:javascript
运行
复制
import numpy as np

# simulating your data by randomly generating numbers in [-0.5, 0.5)
y = np.random.rand(8, 180_000) - 0.5
print(y.shape) # (8, 180000)

collisions = np.sum(y > 0, axis=0, dtype=np.uint8)
print(collisions.shape) # (180000,)
print(collisions) # [4 4 4 ... 1 6 7]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66184421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档