我是NumPy/SciPy的新手。从文档来看,预分配单个数组似乎比调用append/insert/concatenate更有效。
例如,要将一列1添加到数组中,我认为:
ar0 = np.linspace(10, 20, 16).reshape(4, 4)
ar0[:,-1] = np.ones_like(ar0[:,0])
最好是这样:
ar0 = np.linspace(10, 20, 12).reshape(4, 3)
ar0 = np.insert(ar0, ar0.shape[1], np.ones_like(ar0[:,0]), axis=1)
我的第一个问题是这是否正确(第一个更好),我的第二个问题是,目前,我只是像这样预分配我的数组(我在SciPy网站上的几个Cookbook示例中注意到):
np.zeros((8,5))
“NumPy-preferred”的方法是什么?
3条答案
按热度按时间tktrz96b1#
预分配会在一次调用中错误分配您所需的所有内存,而调整数组大小(通过调用append、insert、concatenate或resize)可能需要将数组复制到更大的内存块。所以你是对的,预分配比调整大小更好(而且应该更快)。
根据您想要创建的内容,有许多预分配numpy数组的“首选”方法。有
np.zeros
,np.ones
,np.empty
,np.zeros_like
,np.ones_like
和np.empty_like
,以及许多其他创建有用数组的数组,如np.linspace
和np.arange
。所以呢
如果这最接近您想要的
ar0
,则可以。但是,要使最后一列都是1,我认为首选的方法是说
由于
ar0[:,-1]
的形状是(4,)
,因此1是broadcasted以匹配此形状。oyjwcjzk2#
在性能很重要的情况下,**
np.empty
和np.zeros
**似乎是初始化numpy数组的最快方法。下面是每种方法和其他一些方法的测试结果。值以秒为单位。
v8wbuo2f3#
根据我的经验,
numpy.empty()
是预分配HUGE阵列的最快方法。我所说的数组的形状类似于(80,80,300000)
和dtypeuint8
。代码如下:
和时间的结果: