题 初始化未知长度的numpy数组


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

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

a= np.array()
for x in y:
     a.append(x)

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


29
2018-04-12 10:39


起源


可能更有效的方法是分配一些大型阵列,并在每次达到容量时将其大小加倍。 - wim


答案:


构建一个Python列表并将其转换为Numpy数组。这需要按每次附加的O(1)时间摊销+ O(ñ)用于转换为数组,总共为O(ñ)。

    a = []
    for x in y:
        a.append(x)
    a = np.array(a)

60
2018-04-12 11:04



或者更好的是: a = np.array([x for x in y]);要不就 a = np.array(list(y)) - A T


你可以这样做:

a = np.array([])
for x in y:
    a = np.append(a, x)

7
2018-04-12 10:57



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


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

a = np.array(list(y))

会做的,而且速度要快得多:

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

4
2018-03-27 22:34





对于后代,我认为这更快:

a = np.array([np.array(list()) for _ in y])

您甚至可以传入生成器(即[] - >()),在这种情况下,内部列表永远不会完全存储在内存中。


回应以下评论:

>>> import numpy as np
>>> y = range(10)
>>> a = np.array([np.array(list) for _ in y])
>>> a
array([array(<type 'list'>, dtype=object),
       array(<type 'list'>, dtype=object),
       array(<type 'list'>, dtype=object),
       array(<type 'list'>, dtype=object),
       array(<type 'list'>, dtype=object),
       array(<type 'list'>, dtype=object),
       array(<type 'list'>, dtype=object),
       array(<type 'list'>, dtype=object),
       array(<type 'list'>, dtype=object),
       array(<type 'list'>, dtype=object)], dtype=object)

1
2018-04-24 01:07



我在这里做了一个改变:list(_)并且效果很好 - javadba
要清楚@javadba,你不需要这样做 - 我确定有些Pythonistas会冒犯:) - BenDundee
这不是风格问题。如果没有列表(_)它甚至没有工作,因为我知道y是一个数组本身 - javadba


a = np.empty(0)
for x in y:
    a = np.append(a, x)

0
2017-08-08 21:19