Skip to main content
 首页 » 编程设计

python之预分配 ndarray

2025年05月04日33kevingrace

如何预分配数组的数组,以便更有效地进行追加。在 Matlab 中有一个名为 cell(required_length) 的函数,它预先分配可以存储数组的“单元格”。

我有一个目前看起来像这样的数组:

a=np.array([[1,2],[1],[2,3,4]])     
b=np.array([[20,2]])     

但是我希望附加 1000 个更多的数组,就像显示的 'b' 但大小不同。

请您参考如下方法:

这不仅仅是一个预分配数组的问题,例如np.empty((100,), dtype=int)。这同样是一个关于如何将大量列表收集到一个结构中的问题,无论它是列表还是 numpy 数组。在我看来,与 MATLAB 单元的比较足以值得进一步讨论。


我认为您应该使用 Python 列表。它们可以包含不同大小的列表或其他对象(包括数组)。您可以轻松地附加更多项目(或使用扩展来添加多个对象)。 Python 永远拥有它们; MATLAB 添加了单元以接近这种灵 active 。

np.arrays 与 dtype=object 相似 - 指向对象(例如列表)的指针数组。在大多数情况下,它们只是带有数组包装器的列表。您可以将数组初始化为某个较大的大小,然后插入/设置项目。

A = np.empty((10,),dtype=object) 

生成一个包含 10 个元素的数组,每个元素都None。

 A[0] = [1,2,3] 
 A[1] = [2,3] 
 ... 

您还可以将元素连接到现有数组,但结果是新的。有一个np.append 函数,但它只是concatenate 的一个掩护;它不应与列表 append 混淆。

如果它必须是一个数组,你可以很容易地从最后的列表构造它。这就是您的 np.array([[1,2],[1],[2,3,4]]) 所做的。

How to add to numpy array entries of different size in a for loop (similar to Matlab's cell arrays)?


关于速度的问题,我们来试试简单的时间测试

def witharray(n): 
    result=np.empty((n,),dtype=object) 
    for i in range(n): 
        result[i]=list(range(i)) 
    return result 
 
def withlist(n): 
    result=[]                          
    for i in range(n): 
        result.append(list(range(i))) 
    return result 

产生

In [111]: withlist(4) 
Out[111]: [[], [0], [0, 1], [0, 1, 2]] 
 
In [112]: witharray(4) 
Out[112]: array([[], [0], [0, 1], [0, 1, 2]], dtype=object) 
 
In [113]: np.array(withlist(4)) 
Out[113]: array([[], [0], [0, 1], [0, 1, 2]], dtype=object) 

时间测试

In [108]: timeit withlist(400) 
1000 loops, best of 3: 1.87 ms per loop 
 
In [109]: timeit witharray(400) 
100 loops, best of 3: 2.13 ms per loop 
 
In [110]: timeit np.array(withlist(400)) 
100 loops, best of 3: 8.95 ms per loop 

简单地构建列表列表是最快的。但如果结果必须是一个对象类型的数组,那么给一个空数组赋值会更快。