预分配ndarrays

时间:2015-10-04 05:48:48

标签: python numpy

如何预先分配数组数组,以便我可以更有效地添加一些数据。在Matlab中有一个叫做cell(required_length)的函数,它可以预先分配单元格'它可以存储数组。

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

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

但是我希望追加1000多个类似于' b'显示但尺寸不同。

1 个答案:

答案 0 :(得分:5)

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

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

带有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)

timetests

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

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