我是NumPy/SciPy的新手.从文档中,预分配单个数组而不是调用append/insert/concatenate似乎更有效.
例如,要向数组中添加1的列,我认为这样:
ar0 = np.linspace(10, 20, 16).reshape(4, 4)
ar0[:,-1] = np.ones_like(ar0[:,0])
Run Code Online (Sandbox Code Playgroud)
比这更受欢迎:
ar0 = np.linspace(10, 20, 12).reshape(4, 3)
ar0 = np.insert(ar0, ar0.shape[1], np.ones_like(ar0[:,0]), axis=1)
Run Code Online (Sandbox Code Playgroud)
我的第一个问题是这是否正确(第一个是更好的),我的第二个问题是,目前,我只是预先分配我的数组(我在SciPy网站上的几个Cookbook示例中注意到):
np.zeros((8,5))
Run Code Online (Sandbox Code Playgroud)
什么是'NumPy首选'的方式来做到这一点?
unu*_*tbu 21
预分配mallocs在一次调用中需要的所有内存,同时调整数组大小(通过调用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)
Run Code Online (Sandbox Code Playgroud)
如果这最接近ar0你的愿望就好了.
但是,为了使最后一列全部为1,我认为首选方式就是说
ar0[:,-1]=1
Run Code Online (Sandbox Code Playgroud)
由于形状ar0[:,-1]就是(4,),在1被广播到该形状相匹配.
在性能很重要的情况下,np.empty并且np.zeros似乎是初始化 numpy 数组的最快方法。
以下是每种方法和其他一些方法的测试结果。值以秒为单位。
>>> timeit("np.empty(1000000)",number=1000, globals=globals())
0.033749611208094166
Run Code Online (Sandbox Code Playgroud)
>>> timeit("np.zeros(1000000)",number=1000, globals=globals())
0.03421245135849915
Run Code Online (Sandbox Code Playgroud)
>>> timeit("np.arange(0,1000000,1)",number=1000, globals=globals())
1.2212416112155324
Run Code Online (Sandbox Code Playgroud)
>>> timeit("np.ones(1000000)",number=1000, globals=globals())
2.2877375495381145
Run Code Online (Sandbox Code Playgroud)
>>> timeit("np.linspace(0,1000000,1000000)",number=1000, globals=globals())
3.0824269766860652
Run Code Online (Sandbox Code Playgroud)