附加numpy数组的有效方法

时间:2014-06-26 19:56:49

标签: python arrays numpy

我会保持简单。我有一个循环,将新行附加到numpy数组...这是有效的方法。

n=np.zeros([1,2])
for x in [[2,3],[4,5],[7,6]]
      n=np.append(n,x,axis=1)

现在问题是[0,0]坚持它所以我必须通过

删除它
   del n[0]

这似乎是愚蠢的...所以请告诉我一个有效的方法来做到这一点。

   n=np.empty([1,2])

更糟糕的是它创造了一个未初始化的价值。

3 个答案:

答案 0 :(得分:7)

对于"为什么列表"的一些技术解释。一部分。

在内部,未知长度列表的问题在于,无论长度如何,它都需要以某种方式适合内存。基本上有两种不同的可能性:

  1. 使用数据结构(链表,某些树结构等),这样就可以为列表中的每个新元素分别分配内存。

  2. 将数据存储在连续的内存区域中。创建列表时必须分配此区域,并且必须大于我们最初需要的区域。如果我们在列表中获得更多内容,我们需要尝试分配更多内存,最好是在同一位置。如果我们不能在同一个位置进行,我们需要分配一个更大的块并移动所有数据。

  3. 第一种方法可以实现各种花哨的插入和删除选项,排序等。但是,顺序读取速度较慢,并且分配更多内存。 Python实际上使用方法#2,列表存储为"动态数组"。有关这方面的更多信息,请参阅:

    Size of list in memory

    这意味着使用append列表的效率非常高。如果您事先不知道列表的大小,那么您可以做很少的事情来加快速度。


    如果您事先知道列表的最大大小,那么最好使用numpy.array(不是numpy.empty)分配numpy.zeros最大大小,然后使用{{ 1}}填写所有数据后缩小数组。

    出于某种原因,ndarray.resize numpy.array(l)列表中的列表通常很慢,而大型列表的复制速度很快(我只是试图创建一个100 000 000元素数组的副本) ;花了不到0.5秒)。

    此讨论对不同选项有更多基准:

    Fastest way to grow a numpy numeric array

    我没有对l + numpy.empty组合进行基准测试,但两者都应该是微秒级而非毫秒级操作。

答案 1 :(得分:5)

如果列表中已包含所有内容,则有三种方法可以执行此操作:

data = [[2, 3], [4, 5], [7, 6]]
n = np.array(data)

如果您知道最终数组有多大:

exp = np.array([2, 3])    

n = np.empty((3, 2))
for i in range(3):
    n[i, :] = i ** exp

如果您不知道最终数组有多大:

exp = np.array([2, 3])

n = []
i = np.random.random()
while i < .9:
    n.append(i ** exp)
    i = np.random.random()
n = np.array(n)

您可以从n = np.empty((0, 2))开始,或者我不建议在循环中追加该数组。

答案 2 :(得分:0)

您可能想尝试:

import numpy as np

n = np.reshape([], (0, 2))
for x in [[2,3],[4,5],[7,6]]:
      n = np.append(n, [x], axis=0)

您也可以使用np.append代替n = np.vstack([n,x])。我也同意@Bi Rico我也会使用一个列表,如果n不需要在循环中访问。