我希望能够“动态”构建一个numpy数组,我不知道这个数组的大小。
例如,我想做这样的事情:
a= np.array()
for x in y:
a.append(x)
这将导致包含x的所有元素,显然这是一个简单的答案。我只是好奇这是否可能?
答案 0 :(得分:71)
构建Python列表并将其转换为Numpy数组。对于转换为数组,需要按每次附加的O(1)时间+( n )分摊,总计为O( n )。
a = []
for x in y:
a.append(x)
a = np.array(a)
答案 1 :(得分:12)
你可以这样做:
a = np.array([])
for x in y:
a = np.append(a, x)
答案 2 :(得分:4)
由于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
答案 3 :(得分:1)
对于后代,我认为这更快:
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)
答案 4 :(得分:0)
a = np.empty(0)
for x in y:
a = np.append(a, x)
答案 5 :(得分:0)
我写了一个小实用函数。 (上面的大多数答案都很好。我觉得这看起来更好)
def np_unknown_cat(acc, arr):
arrE = np.expand_dims(arr, axis=0)
if acc is None:
return arrE
else:
return np.concatenate((acc, arrE))
您可以使用上面的函数如下:
acc = None # accumulator
arr1 = np.ones((3,4))
acc = np_unknown_cat(acc, arr1)
arr2 = np.ones((3,4))
acc = np_unknown_cat(acc, arr2)