numpy 在特定位置添加子矩阵

uttx8gqw  于 9个月前  发布在  其他
关注(0)|答案(2)|浏览(111)

我有一个形状为40x40的测试矩阵(z),填充了零。
我需要在测试矩阵的特定位置添加4个形状子矩阵,称为c1,c2(5x5),c3(7x7)和c4(9x9)。
我想把子矩阵的中心放在相应的位置,然后简单地执行元素的加法。测试矩阵中的位置是:z(9,9),z(9,29),z(29,9),z(29,29)。
我试着看这些线程,但我不能得到一个明确的答案,如何解决我的问题。How to add different arrays from the center point of an array in Python/NumPyAdding different sized/shaped displaced NumPy matrices
我尝试的代码示例:

def zero_matrix(d):
    matrix = np.zeros((d,d), dtype=np.float)
    return matrix

z = zero_matrix(40)

c1 = np.genfromtxt('xxxxxx', dtype=None, delimiter = '\t')
c2 = np.genfromtxt('xxxxxx', dtype=None, delimiter = '\t')
c3 = np.genfromtxt('xxxxxx', dtype=None, delimiter = '\t')
c4 = np.genfromtxt('xxxxxx', dtype=None, delimiter = '\t')

def adding(z):
    for i in range(z.shape[0]):
        for j in range(z.shape[1]):
            if i == 9 and j==9:
                c1mid = c1.shape[0]//2
                z[i,j] = c1[c1mid,c1mid]
    print z
    return z

字符串
但这只是增加了中心,而不是整个子矩阵。
它应该看起来像这样:

dsf9zpds

dsf9zpds1#

numpy中数组切片的好处是你不需要使用for循环。它只放置中心元素的原因是因为你只放置一个元素(c1[c1mid,c1mid]是一个数字),下面是你可以做的:

z[7:12,7:12] = c1
    z[7:12,27:32] = c2
    z[26:33,6:14] = c3
    z[25:34,25:33] = c4

字符串

uqjltbpv

uqjltbpv2#

内置的np.ix_工作完美

import numpy as np   
a=np.zeros([5,5])
b=np.random.rand(3,3)*100
idx=[0,2,3]
print(a)
a[np.ix_(idx, idx)]+=b
print(a)

字符串
输出是

[[0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]]
[[56.22112929  0.         57.43572879  2.90797715  0.        ]
 [ 0.          0.          0.          0.          0.        ]
 [54.08128804  0.         23.53431307 24.03463619  0.        ]
 [96.7227866   0.          3.01937951 68.09775321  0.        ]
 [ 0.          0.          0.          0.          0.        ]]

相关问题