Numpy 2d数组:在修改相邻元素时考虑边界元素



我正在使用CodeSignal练习来学习编程,所以它开始了。我有一个2d numpy数组(称为矩阵((如果有更好的结构,则不必是numpy(,还有2个用于循环矩阵中每个元素的循环,检查它是否满足某些条件。我已经创建了一个与输入矩阵大小相同的np.zeros数组(称为result(,它将用我的结果填充。

返回for循环。当满足矩阵的索引为i,j的给定元素的条件时,我希望程序识别所有相邻元素,并将每个元素加1。

例如,如果

matrix = [[True, False, False], 
[False, False, False], 
[False, False, False]]

然后

result = [[0, 1, 0], 
[1, 1, 0], 
[0, 0, 0]] 

我现在拥有的:

matrix = np.array(matrix)            
(row, col) = matrix.shape
result = np.zeros((row,col), dtype=int)
for i in range(0, row): 
for j in range(0, col):
print(i,j)
if matrix[i,j] == True:
matrix[i-1:i+2, j-1:j+2] += 1      ##problem 
return result 

我所指出的行的问题当然是,如果元素位于边界,它就不起作用,因为没有I-1或I+2等。(我试过了,没有错误消息,它只是不在零矩阵上执行任何功能(。我可以写一堆if语句,比如if I==0或j==0或I==row或j==col,并为每个语句指定单独的切片,但肯定有比这更简单的方法,我想不出也找不到。

提前感谢您的帮助。

将子矩阵相加:

matrix = np.array(matrix)            
result = np.zeros(matrix.shape, dtype=int)
result[1:,1:] += matrix[:-1,:-1]
result[1:,:] += matrix[:-1,:]
result[1:,:-1] += matrix[:-1,1:]
result[:,1:] += matrix[:,:-1]
result[:,:-1] += matrix[:,1:]
result[:-1,1:] += matrix[1:,:-1]
result[:-1,:] += matrix[1:,:]
result[:-1,:-1] += matrix[1:,1:]

您想要做的是使用内核[[1,1,1],[1,1,1],[1,1,1]]对矩阵进行卷积,然后用零替换初始单元格。通常的方法是使用scipy来进行类似的操作:

>>> matrix = np.array([[True, False, False], 
[False, False, False], 
[False, False, False]])
>>> M = scipy.signal.convolve2d(matrix, 
np.array([[1,1,1],[1,1,1],[1,1,1]]), 
mode='same')
>>> M
array([[1, 1, 0],
[1, 1, 0],
[0, 0, 0]])

然而,numpy仅允许执行1D卷积。但由于我们的内核是非常对称的,我发现了一种小技巧,可以实现与2D卷积相同的结果:

M = np.vstack([np.convolve(n, [1, 1, 1], 'same') for n in matrix])
M = np.column_stack([np.convolve(n, [1, 1, 1], 'same') for n in matrix.T])

如果你想把初始单元格分配给零,可以这样做:

np.logical_xor(M, matrix)

最新更新