预分配NumPy数组的首选方法是什么?

发布于 2021-01-29 16:54:46

我是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首选”方式?

关注者
0
被浏览
49
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    预分配在一次调用中分配了您需要的所有内存,而调整数组的大小(通过对append,insert,concatenate或resize的调用)可能需要将数组复制到更大的内存块中。因此,您是正确的,相比于调整大小,预分配是首选的(并且应该比调整大小要快)。

    根据您要创建的内容,有许多“首选”方法可以预分配numpy数组。有np.zerosnp.onesnp.emptynp.zeros_likenp.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以匹配该形状。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看