我多次调用一个返回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
之后将附加这些值。
有人可以帮我吗?谢谢!
答案 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)