python - 在 numpy 中计算对角线和

标签 python numpy numpy-ndarray array-broadcasting

<分区>

我有一个相当大的矩形 numpy 数组,形状为 (m, n),例如:

>>> a.shape
(27584, 34092)

我必须计算每个 anti-diagonal 的总和的阵列。这个新数组的形状为 (m + n - 1,)

简单的方法是:

m, n = a.shape
r = np.zeros(m + n - 1)
for i in range(m):
    for j in range(n):
        r[i + j] += a[i][j]

# r is the sum of all anti-diagonals of a

这显然很慢,有什么方法可以使用巧妙的 numpy 原语来执行计算吗?我唯一的其他选择是用 C++ 编写代码,这也是可行的 - 但需要更多工作。

最佳答案

在我看来,最直观的解决方案是:

  • 使用 a[::-1] 来“翻转”行的顺序,这样您就可以 在“正常”对角线上操作,
  • 使用np.diagonal 访问每条对角线,
  • 对返回的对角线求和,
  • 将上面的代码放在一个列表理解中。

所以整个代码可以是:

result = [np.diagonal(a[::-1], offs).sum() for offs in range(-a.shape[0] + 1, a.shape[1])]

它的运行速度应该比您的代码快得多。

因为你的源数组很大,也许你会得到一些速度 增益:

  • 在开头计算“翻转”数组一次
  • 然后对这个数组进行操作:

所以重新编写的代码,包括关于 np.trace 的提示(见评论), 可以是:

b = a[::-1]
result = [np.trace(b, offs) for offs in range(-a.shape[0] + 1, a.shape[1])]

关于python - 在 numpy 中计算对角线和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70195055/

相关文章:

python - 用 0 和 1 填充的 numpy 二维数组的所有组合

python - 最后删除具有重复值的行

python - 为什么 += 添加和 int.从一个列表到另一个列表而不仅仅是+?

python - 如何在不使用计数或计数器的情况下计算列表项的出现次数?

python - 'numpy.ndarray' object is not callable error with optimize.minimize

python - 如何创建关于年龄与时间的 np 数组随机数据?

python - 如何创建或更新列

pandas - 生成具有条件的随机数列表 - numpy

python - 如何找到字符串中字符的ascii值?

python - Numpy 使用值列表