我多次调用一个对象,返回一个numpy列表:
for x in range(0,100):
d = simulation3()
d = [0, 1, 2, 3]
d = [4, 5, 6, 7]..and还有更多
我想获取每个列表并将其附加到一个2D数组中。
final_array = [[0, 1, 2, 3],[4, 5, 6, 7]...and等]
我尝试创建一个空数组(final_array = np.zeros(4,4))并将其追加,但在创建4X4 matrix之后会追加这些值。
有人能帮我吗?谢谢!
发布于 2018-08-29 19:47:54
最佳解决方案取决于您正在处理的数字/大小。我最喜欢的解决方案(只有当你已经知道最终结果的大小时才有效)是初始化包含结果的数组,然后填充每个数组,你可以初始化结果,然后使用视图填充它。这是内存效率最高的解决方案。
如果您不知道最终结果的大小,那么您最好生成一个列表列表,该列表可以在过程结束时转换(或堆叠)为NumPy数组。
以下是一些示例,其中gen_1d_list()用于生成一些随机数来模拟simulate3()的结果(这意味着在以下代码中,您应该将gen_1d_list(n, dtype)替换为simulate3()):
stacking1()使用viewsstacking2()实现填充,arraystacking3()实现列表生成,arraystacking4()和将转换为NumPy实现列表生成,堆叠到NumPy array实现前面提出的使用vstack()动态修改NumPy数组。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)对于较大尺寸的输入:
n, m = 4, 1000000
%timeit stacking1(n, m)
# 344 ms ± 1.64 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit stacking2(n, m)
# 350 ms ± 1.65 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit stacking3(n, m)
# 370 ms ± 2.75 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit stacking4(n, m)
# 369 ms ± 3.01 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)https://stackoverflow.com/questions/52070051
复制相似问题