Python Numpy从对象追加多个列表

时间:2018-08-29 05:31:00

标签: python numpy

我多次调用一个返回numpy列表的对象:

for x in range(0,100):
        d = simulation3()

d = [0, 1, 2, 3]
d = [4, 5, 6, 7]

..还有更多

我想获取每个列表并将其附加到2D数组。

final_array = [[0, 1, 2, 3],[4, 5, 6, 7] ...等等]

我尝试创建一个空数组(final_array = np.zeros(4,4))并将其附加,但是在创建4X4 matrix之后将附加这些值。

有人可以帮我吗?谢谢!

3 个答案:

答案 0 :(得分:1)

您可以使用np.fromiter从可迭代对象创建数组。由于默认情况下,此功能仅适用于标量,因此您可以使用itertools.chain来提供帮助:

np.random.seed(0)

from itertools import chain

def simulation3():
    return np.random.randint(0, 10, 4)

n = 5
d = np.fromiter(chain.from_iterable(simulation3() for _ in range(5)), dtype='i')
d.shape = 5, 4

print(d)

array([[5, 0, 3, 3],
       [7, 9, 3, 5],
       [2, 4, 7, 6],
       [8, 8, 1, 6],
       [7, 7, 8, 1]], dtype=int32)

但这是相对低效的。 NumPy在固定大小的数组上表现最佳。如果事先知道数组的大小,则可以定义一个空数组并顺序更新行。请参阅由@ norok2描述的alternatives

答案 1 :(得分:0)

在numpy中有多种实现方法,最简单的方法是使用vstack这样:

例如:

#you have these array you want to concat

d1 = [0, 1, 2, 3]
d2 = [4, 5, 6, 7]
d3 = [4, 5, 6, 7]

#initialize your variable with zero raw 
X = np.zeros((0,4))

#then each time you call your function use np.vstack like this :
X = np.vstack((np.array(d1),X))
X = np.vstack((np.array(d2),X))
X = np.vstack((np.array(d2),X))

# and finally you have your array like below
#array([[4., 5., 6., 7.],
#       [4., 5., 6., 7.],
#       [0., 1., 2., 3.]])

答案 2 :(得分:0)

最佳解决方案取决于您要处理的数字/大小。 我最喜欢的解决方案(仅当您已经知道最终结果的大小时才有效)是初始化将包含结果的数组,然后填充每个数组,然后可以初始化结果,然后使用视图对其进行填充。 这是内存效率最高的解决方案。

如果您不知道最终结果的大小,那么最好生成一个列表列表,该列表可以在过程结束时作为NumPy数组转换(或堆叠)。

以下是一些示例,其中gen_1d_list()用于生成一些随机数以模拟simulate3()的结果(这意味着在以下代码中,您应将gen_1d_list(n, dtype)替换为{{ 1}}):

  • simulate3()使用视图实现填充
  • stacking1()实现列表生成和转换到NumPy数组
  • stacking2()实现了列表生成和 stacking 到NumPy数组
  • stacking3()使用stacking4()实现了NumPy数组的动态修改,
vstack()

在时间方面,import numpy as np def gen_1d_list(n, dtype=int): return list(np.random.randint(1, 100, n, dtype)) def stacking1(n, m, dtype=int): arr = np.empty((n, m), dtype=dtype) for i in range(n): arr[i] = gen_1d_list(m, dtype) return arr def stacking2(n, m, dtype=int): items = [gen_1d_list(m, dtype) for i in range(n)] arr = np.array(items) return arr def stacking3(n, m, dtype=int): items = [gen_1d_list(m, dtype) for i in range(n)] arr = np.stack(items, dtype) return arr def stacking4(n, m, dtype=int): arr = np.zeros((0, m), dtype=dtype) for i in range(n): arr = np.vstack((gen_1d_list(m, dtype), arr)) return arr stacking1()差不多快,而stacking2()stacking3()则慢(按比例,小尺寸则慢得多)输入)。

一些数字,用于小尺寸输入:

stacking4()

,对于大尺寸输入:

n, m = 4, 10
%timeit stacking1(n, m)
# 15.7 µs ± 182 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit stacking2(n, m)
# 14.2 µs ± 141 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit stacking3(n, m)
# 22.7 µs ± 282 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%timeit stacking4(n, m)
# 31.8 µs ± 270 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)