初始化未知长度的numpy数组

use*_*022 49 python arrays numpy

我希望能够在运行中"构建"一个numpy数组,我不知道这个数组的大小.

例如,我想做这样的事情:

a= np.array()
for x in y:
     a.append(x)
Run Code Online (Sandbox Code Playgroud)

这将导致包含x的所有元素,显然这是一个简单的答案.我只是好奇这是否可能?

Fre*_*Foo 87

构建一个Python列表并将其转换为Numpy数组.对于转换为数组,需要按每次附加的O(1)时间+ O(n)进行分摊,总计为O(n).

    a = []
    for x in y:
        a.append(x)
    a = np.array(a)
Run Code Online (Sandbox Code Playgroud)

  • 或者更好:`a = np.array([x for x in y])`; 或者只是`a = np.array(list(y))` (3认同)

ale*_*sdm 13

你可以这样做:

a = np.array([])
for x in y:
    a = np.append(a, x)
Run Code Online (Sandbox Code Playgroud)

  • 这种方法每次追加复制数组,即O(sum(range(n))).在我的笔记本电脑上,这种方法比@ larsman的方法慢42倍:按照larsmans方法构建一个列表,我需要1000个循环,最好是每个循环3:1.53 ms.按照这种方法,我只需要10个循环,最好是每个循环3:64.8 ms. (6认同)
  • 每次追加需要线性时间. (5认同)

Mr_*_*s_D 5

由于y是可迭代的,所以我真的不明白为什么要追加的调用:

a = np.array(list(y))
Run Code Online (Sandbox Code Playgroud)

会做,而且速度更快:

import timeit

print timeit.timeit('list(s)', 's=set(x for x in xrange(1000))')
# 23.952975494633154

print timeit.timeit("""li=[]
for x in s: li.append(x)""", 's=set(x for x in xrange(1000))')
# 189.3826994248866
Run Code Online (Sandbox Code Playgroud)