【问题标题】:How to add every couple row of matrix?如何添加每几行矩阵?
【发布时间】:2021-02-03 17:42:43
【问题描述】:

假设我有一个类似的矩阵

a = np.array([[[ 1,  2], [ 3,  4]],
              [[ 5,  6], [ 7,  8]],
              [[ 9, 10], [11, 12]],
              [[13, 14], [15, 16]]])

形状是(4, 2, 2)。我想将前两个和第二个两个矩阵相加。最终输出的大小应该是(2, 2, 2) 并且输出应该是

output = np.array([[[ 6,  8], [10, 12]],
                   [[22, 24], [26, 28]]])

你可以在下面看到我的尝试:

import numpy as np

a = np.array([[[ 1,  2], [ 3,  4]],
              [[ 5,  6], [ 7,  8]],
              [[ 9, 10], [11, 12]],
              [[13, 14], [15, 16]]])

output = np.add(a[:2], a[2:])

【问题讨论】:

  • 请修正您的变量名。一行调用它Input,这不是很pythonic,另一行称为a。选择一个。
  • 另外,np.add 在这种情况下只是 +

标签: python numpy add


【解决方案1】:

使用整形将第一个维度分成两个,沿第二个轴求和:

a.reshape(2, 2, *a.shape[1:]).sum(axis=1)

您当前的方法等效于a.reshape(2, 2, *a.shape[1:]).sum(axis=0)。正确的方法是对整个数组的每隔一行进行切片,而不是对整个数组的每个其他块进行切片:

a[::2] + a[1::2]

后一种方法不能很好地概括。如果你必须把每七块加起​​来,你会得到

a[::7] + a[1::7] + a[2::7] + a[3::7] + ... + a[6::7]

然而,前一种方法相当灵活:

a.reshape(-1, 7, *a.shape[1:]).sum(axis=1)

【讨论】:

  • 谢谢,如果我有一个矩阵 a=np.random.randint(5,size=(140,64,1,60,60)) 并想添加前 7 个矩阵和第二个7 以此类推...最终输出的大小应为 (20,64,1,60,60)。
  • @Aras。请努力理解我在这里写的内容以及它是如何工作的。努力自己解决切片问题。如果这不起作用,请再问一个问题。
  • 我想这应该是正确的:b=a.reshape(20,7, *a.shape[1:]).sum(axis=1)
  • @Aras。我想你明白了它的要点:)我很高兴你花时间来完成它。
  • 另一个快速的问题:如果矩阵之一,即 (140,64,1,60,60)) 的最后一个,而不是大小 64,是 8。实际上,这就是批量大小通常在最后一个矩阵中有所不同。它引发错误“操作数无法与形状一起广播(64,1,600,600)(8,1,600,600)”
猜你喜欢
  • 1970-01-01
  • 2018-05-11
  • 2011-12-22
  • 1970-01-01
  • 2016-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多