Python 将三维数组折叠为二维数组

Python 将三维数组折叠为二维数组,python,arrays,numpy,multidimensional-array,Python,Arrays,Numpy,Multidimensional Array,我在python中有一个二维数组,所有数组都是20行,但列数是可变的(每个都在80到90之间) 我想在这些二维数组中迭代添加数值(浮点)值,以创建一个最终的二维数组(请参见下面的示意图) 我是python/numpy库的新手,发现了一些可能是我想要的函数,但似乎无法让它们正常工作 连接 表示它将添加两个大小不同的矩阵(假设一个轴是完全相同的,我想?),但我不知道如何迭代地执行添加步骤。原因是我想在循环的作用域之外初始化一个空的numpy数组,这样我就可以反复添加并保存值,但是当我尝试使用以下命令

我在python中有一个二维数组,所有数组都是20行,但列数是可变的(每个都在80到90之间)

我想在这些二维数组中迭代添加数值(浮点)值,以创建一个最终的二维数组(请参见下面的示意图)

我是python/numpy库的新手,发现了一些可能是我想要的函数,但似乎无法让它们正常工作

连接 表示它将添加两个大小不同的矩阵(假设一个轴是完全相同的,我想?),但我不知道如何迭代地执行添加步骤。原因是我想在循环的作用域之外初始化一个空的numpy数组,这样我就可以反复添加并保存值,但是当我尝试使用以下命令初始化数组时:

my_final_matrix = np.array()
它抛出一个错误,即构造函数中未定义数组

展平/重塑减少维度,但不添加值

简言之——我如何迭代地将不同大小的矩阵添加到 努比


如果您知道最大列数,那么只需使用一点内存开销(在小型矩阵场景中没有那么多),并将所有矩阵初始化为(最大20 x(90?)。当您不动态地弄乱矩阵时,numpy/scipy工作得最好(即最快、最一致)


或者,更符合您最初的问题(但效率要低得多),当您遇到越来越大的矩阵时,您可以将最小的矩阵重塑为最大的矩阵(零填充或其他选项)。

我不知道有哪一个numpy函数可以做到这一点,但如果可以接受for循环,您可以这样做:

array_sum = np.zeros((20, 90))
for array in arrays:
    array_sum[:, :array.shape[1]] += array

以下是自动检测所需输出大小的解决方案:

>>> 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]])

通过重塑为20x90(缺失值可以为零),将所有内容都设置为一维。然后添加它们并重新调整大小,这样您就可以忽略不需要的尺寸。对于那些可能丢失的[80-90]列,您想做什么?将所有内容剪切到80列,忽略其余部分?在短列中填充0或
nan
?或者其他一些魔法使得添加不同大小的东西成为可能?折叠、连接或添加不同大小的数组是一个定义很差的操作。我想用零填充短列,是的。