初始化未知长度的数字数组

我希望能够“建立”一个飞行数组,我不知道这个数组的大小事先。

例如,我想这样做:

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

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

194595 次浏览

你可以这样做:

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

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

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

对于子孙后代来说,我认为这样更快:

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)
a = np.empty(0)
for x in y:
a = np.append(a, x)

由于 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

我写了一个小的实用函数。(上面的大多数答案都很好。我觉得这个看起来更好)

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)
list1 = []
size = 1
option = "Y"
for x in range(size):
ele = input("Enter Element For List One : ")
list1.append(ele)
while(option == "Y"):
option = input("\n***Add More Element Press Y ***: ")
if(option=="Y"):
size = size + 1
for x in range(size):
ele = input("Enter Element For List Element : ")
list1.append(ele)
size = 1
else:
break;
print(list1)

例如:

list1 = []    # Store Array Element
size = 1      # Rune at One Time
option = "Y"  # Take User Choice

实施方法:

  • 对于大小变量范围内的循环,由于 size = 1,循环只运行一次
  • 使用 While 循环
    • 如果用户想要添加“ Y”else“ N”,则接受他们的输入
    • 在 while 循环中,如果选项是“ Y”,则使用 if else 语句 增加大小,有助于运行2时间数组,因为 size = size + 1 在一定范围内运行另一个 for 循环
    • 否则就崩溃