python - 将给定点上的 3x3 数组求和到另一个保持边界的矩阵

标签 python numpy

假设我有这个二维数组 A:

[[0,0,0,0],
 [0,0,0,0],
 [0,0,0,0],
 [0,0,0,4]]

我想对 B 求和:

[[1,2,3]
 [4,5,6]
 [7,8,9]]

以 A[0][0] 为中心,因此结果为:

array_sum(A,B,0,0) =
[[5,6,0,4],
 [8,9,0,0],
 [0,0,0,0],
 [2,0,0,5]]

我想我应该创建一个函数来比较它是否在边界上,然后调整索引:

def array_sum(A,B,i,f):
   ...
   if i == 0 and j == 0:
      A[-1][-1] = A[-1][-1]+B[0][0]
      ...

   else:
      A[i-1][j-1] = A[i][j]+B[0][0]
      A[i][j] = A[i][j]+B[1][1]
      A[i+1][j+1] = A[i][j]+B[2][2]
      ...

但我不知道是否有更好的方法来做到这一点,我正在阅读有关广播的内容,或者可能使用卷积来实现这一点,但我不确定是否有更好的方法来做到这一点。

最佳答案

假设B.shape都是奇数,您可以使用np.indices,操纵它们指向您想要的位置,然后使用np.add。在

def array_sum(A, B, loc = (0, 0)):
    A_ = A.copy()
    ix = np.indices(B.shape)
    new_loc = np.array(loc) - np.array(B.shape) // 2
    new_ix = np.mod(ix + new_loc[:, None, None], 
                    np.array(A.shape)[:, None, None])
    np.add.at(A_, tuple(new_ix), B)
    return A_

测试:

array_sum(A, B)
Out:
array([[ 5.,  6.,  0.,  4.],
       [ 8.,  9.,  0.,  7.],
       [ 0.,  0.,  0.,  0.],
       [ 2.,  3.,  0.,  5.]])

关于python - 将给定点上的 3x3 数组求和到另一个保持边界的矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52830580/

相关文章:

python - 如何在 Django 中处理数据校正(但这不是 Django 特有的!)

python - 在 Python 与 Matlab 中减去 3D numpy 数组

python - 将 Numpy 方阵数组转换为 numpy 方阵,保留 "layout"

python - Matplotlib 通过颜色图绘制带有颜色的线条

python - numpy中的逐行乘法

python - 如何将这个函数向量化?

python - 在 2 个数据帧之间相乘

python - 设置 random.seed() 以重新创建模拟行为和选择种子的影响

Python:帮助解决UnboundLocalError:赋值前引用的局部变量

python - 如何使setsockopt IP_ADD_MEMBERSHIP接受本地接口(interface)地址以仅在一个特定接口(interface)上接收多播数据包?