我在python中有一个二维数组的数组,所有这些数组都是20行,但是有可变的列号(每个都在80到90之间)。
我想迭代地在这些二维数组中添加数值(浮点)值来创建一个最终的二维数组(参见下面的原理图)。
我是python / numpy库的新手,发现了一些我可能正在寻找的功能,但似乎无法让它们发挥作用。
CONCATENATE docs here说它会添加两个不同大小的矩阵(假设一个轴完全相同,我想?)但我不知道如何实际迭代地执行加法步骤。原因是因为我想在我的循环范围之外初始化一个空的numpy数组,所以我可以一遍又一遍地添加它并保存值,但是当我尝试用以下内容初始化数组时:
my_final_matrix = np.array()
它抛出一个错误,在构造函数中没有定义数组。
FLATTEN / RESHAPE docs here降低维度但不添加值。
简而言之 - 如何迭代添加不同大小的矩阵 numpy的?
答案 0 :(得分:1)
如果您知道最大列数,那么只需使用一点内存开销(在小矩阵场景中没有那么多)并将所有矩阵初始化为(20 x max(90?))。 numpy / scipy工作效果最好(即最快且最一致),当你不动态地混淆矩阵时。
或者,更符合您的原始问题(但效率低得多),您可以在遇到越来越大的矩阵时将最小矩阵重塑为最大矩阵(零填充或其他任何选项)。
答案 1 :(得分:1)
我不知道有一个numpy函数可以做到这一点,但如果for循环可以接受,你可以这样做:
array_sum = np.zeros((20, 90))
for array in arrays:
array_sum[:, :array.shape[1]] += array
答案 2 :(得分:0)
这是一个自动检测所需输出大小的解决方案:
>>> import numpy as np
>>>
# create ragged list
>>> n = 4
>>> ragged = list(map(np.full, np.random.randint(1, 6, (n, 2)), 10**np.arange(n)))
>>>
>>> ragged
[array([[1, 1, 1]]), array([[10, 10],
[10, 10],
[10, 10]]), array([[100],
[100],
[100]]), array([[1000, 1000, 1000, 1000],
[1000, 1000, 1000, 1000]])]
>>>
# find maximum size in each dimension
>>> maxsh = *map(max, zip(*map(np.shape, ragged))),
# allocate result
>>> result = np.zeros(maxsh, dtype=ragged[0].dtype)
# and add
>>> for r in ragged:
... result[(*map(slice, r.shape),)] += r
...
>>> result
array([[1111, 1011, 1001, 1000],
[1110, 1010, 1000, 1000],
[ 110, 10, 0, 0]])