我需要在循环中向一个numpy数组中添加很多值(大约100k),并且知道以下方法:
import numpy as np
import time
#Method 1:
start = time.time()
b = np.array([0.0])
for i in range (1, 100000):
b = np.append(b, np.array([i]))
end = time.time()
print(end-start)
#Method 2:
start = time.time()
a = np.array([0])
A = np.empty(99999) * np.nan
a = np.concatenate((a, A), axis=0)
for i in range (1, 100000):
a[i] = i
end = time.time()
print(end-start)
_______________________________
result:
3.2555339336395264
0.018993854522705078
正如你所看到的,方法2更快,但问题是我必须从数组中删除np.nan(因为我不知道应该向数组中添加多少值,所以我创建了比它应该更大的np.nan数组)。
4条答案
按热度按时间u1ehiz5o1#
可以使用nan_to_num来删除NaN:
vwoqyblh2#
如果你要添加的是一个常量值,你可以使用np array +一个常量值来添加数组的每个元素。因为它不是100%你初始化的目的,你也可以使用arange来设置数组。
即
roqulrg33#
据我所知,第二种方法是最佳的,当大小不能事先确定,你不能预测任何关于值。在这种情况下,np.isnan()函数可以用来消除空值。
此外,将空数组乘以
np.nan
是不必要的。这里有一个替代实现(方法3),我希望它能有所帮助:输出:
xghobddn4#
这完全取决于你的最终情况是什么。如果你提前知道你会有多少输入-就像你的玩具例子一样-那么你就可以分配一个足够大的数组。至于“从我的数组中删除np.nan”:只要知道它包含多少有效项,就可以创建过度分配数组的切片视图。
在数据不断进入的一般流式传输情况下,最佳策略是根据需要调整大小,将数组大小增加一个因子,例如2:
如果你有一个长度未知的输入,这是更合适的。在这种情况下,
array.array
is a much better option用于缓冲输入,然后你可以转换为ndarray
用于计算。