预分配NumPy数组的首选方法是什么?
我是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首选”方式?
-
预分配在一次调用中分配了您需要的所有内存,而调整数组的大小(通过对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以匹配该形状。