71

我希望能够即时“构建”一个 numpy 数组,我事先不知道这个数组的大小。

例如我想做这样的事情:

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

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

4

6 回答 6

116

构建一个 Python 列表并将其转换为 Numpy 数组。每次追加 + O( n ) 转换为数组需要分摊 O(1) 时间,总共需要 O( n )。

    a = []
    for x in y:
        a.append(x)
    a = np.array(a)
于 2012-04-12T11:04:00.850 回答
17

你可以这样做:

a = np.array([])
for x in y:
    a = np.append(a, x)
于 2012-04-12T10:57:33.567 回答
7

由于 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
于 2017-03-27T22:34:05.497 回答
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)
于 2013-04-24T01:07:00.973 回答
1
a = np.empty(0)
for x in y:
    a = np.append(a, x)
于 2016-08-08T21:19:54.620 回答
0

I wrote a small utility function. (most answers above are good. I feel this looks nicer)

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

You can use the above function as the following:

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)
于 2021-03-02T07:47:25.837 回答