在所有情况下添加不同维度的数组python

pgky5nke  于 2022-12-10  发布在  Python
关注(0)|答案(4)|浏览(180)
x = np.array([[1],[1],[3]])
y = np.array([[1],[2]])
x+y

我有几个数组要加在一起,它们的结构类似于上面的例子。我想把这些数组加在一起,如果维数不匹配,我想把0加到那个值上。也就是说,结果应该是

array([[2],
       [3],
       [3]])

我不知道“x”和“y”中哪一个的维数更高。有没有好的方法来处理这个问题?我试着将数组的大小调整到两者之间的最大维数,但没有成功

laximzn5

laximzn51#

另一种可能的解决方案使用numpy.pad

max_shape = np.maximum(x.shape[0], y.shape[0])

x = np.pad(x, ((0, max_shape - x.shape[0]), (0, 0)), mode='constant')
y = np.pad(y, ((0, max_shape - y.shape[0]), (0, 0)), mode='constant')

x + y

输出量:

array([[2],
       [3],
       [3]])
9rbhqvlz

9rbhqvlz2#

只需创建另一个与长数组大小相同的数组,并将短数组的空值填充为零,然后将其与长数组相加。
第一个
请注意,这是假设它们的第一个维度不同,如果有更多的维度与第一个维度不同,那么它将变得稍微复杂一些,因为您必须创建两个新数组,其形状是所有维度的最大值。

kmpatx3s

kmpatx3s3#

这里有一个可能的解决方案:

all_arrays = [x, y]
max_len = max([len(arr) for arr in all_arrays])
sum_arr = np.zeros(max_len)
for arr in all_arrays:
    add_these_zeros = max_len - len(arr)
    sum_arr = sum_arr + np.concatenate([arr.flatten(), np.zeros(add_these_zeros)])
    
print(np.reshape(sum_arr, (-1, 1))) # reshape 1D to 2D
  • 首先将所有阵列放入all_arrays
  • 计算最长数组的长度
  • 创建一个数组,其中零的个数与上一步中计算的最大长度相同。
  • 迭代数组
  • 计算特定数组需要多少个零来填充最大数组大小。
  • 将零添加到给定数组,并将其求和为sum_arr
    输出:
array([[2.],
       [3.],
       [3.]])
0sgqnhkj

0sgqnhkj4#

跟踪各种维度似乎是症结所在。在这里,我使用Ravel / Slice /Reform来灵活地处理这一点。

def make_uniform(x, y):
    large = x if x.shape > y.shape else y
    # We return x with large.shape, optionally appending zeros.
    n = np.product(large.shape)
    return (
        np.concatenate(x, np.zeros_like(large))
        .ravel()[:n]
        .reshape(large.shape)
    )

x, y = (make_uniform(x, y),
        make_uniform(y, x))
x + y

相关问题