我是第一次接触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首选”的方式呢?
发布于 2010-08-16 19:10:39
预分配错误地在一次调用中占用了您需要的所有内存,而调整数组大小(通过调用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 = np.linspace(10, 20, 16).reshape(4, 4)
如果这最接近你想要的ar0
,那就好了。
然而,为了使最后一列都是1,我认为更好的方法是直接说
ar0[:,-1]=1
由于ar0[:,-1]
的形状为(4,)
,因此1为broadcasted以匹配此形状。
发布于 2020-11-26 18:54:09
根据我的经验,numpy.empty()
是预分配大型数组的最快方法。我讨论的数组具有(80,80,300000)
和dtype uint8
的形状。
代码如下:
%timeit np.empty((80,80,300000),dtype='uint8')
%timeit np.zeros((80,80,300000),dtype='uint8')
%timeit np.ones((80,80,300000),dtype='uint8')
以及计时的结果:
10000 loops, best of 3: 83.7 µs per loop #Too much faster
1 loop, best of 3: 273 ms per loop
1 loop, best of 3: 272 ms per loop
https://stackoverflow.com/questions/3491802
复制相似问题