我有一个形状为 40x40 的测试矩阵 (z),用零填充。
我需要在测试矩阵的特定位置添加 4 个形状子矩阵,称为 c1、c2(5x5)、c3(7x7) 和 c4(9x9)。
我想将子矩阵中心放置在各自的位置,然后简单地执行元素的添加。 测试矩阵中的位置是: z(9,9)、z(9,29)、z(29,9)、z(29,29)。
我尝试查看这些线程,但无法得到如何解决我的问题的明确答案。 如何在 Python/NumPy 中从数组的中心点添加不同的数组 添加不同大小/形状的移位 NumPy 矩阵
我尝试过的代码示例:
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
但这仅添加了中心,而不是整个子矩阵。
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
内置
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. ]]