有效识别numpy矩阵中的相邻元素

Chr*_*rry 10 python numpy

我有一个100乘100的numpy矩阵.矩阵主要用零填充,但也包含一些数量的整数.例如:

[0 0 0 0 0 0 0 1]
[0 2 2 0 0 0 0 0]
[0 0 2 0 0 0 0 0]  False
[0 0 0 0 0 0 0 0]
[0 3 3 0 0 0 0 0]
Run Code Online (Sandbox Code Playgroud)

确定矩阵是否包含任意数量的不同类型的相邻int的最有效方法是什么?

上面的例子将返回False.这是一个True示例,其中包含指示邻接的行:

[0 0 0 0 0 0 0 1]
[0 2 2 1 1 0 0 0]   <----  True
[0 0 2 0 0 0 0 0]  
[0 0 0 0 0 0 0 0]
[0 3 3 0 0 0 0 0]
Run Code Online (Sandbox Code Playgroud)

对角线不算相邻.所以这个例子也会返回False:

[0 0 0 1 1 1 1 1]
[0 2 2 0 1 0 0 0]
[0 0 2 0 0 0 0 0]   False
[0 3 0 0 0 0 0 0]
[3 3 3 0 0 0 0 0]
Run Code Online (Sandbox Code Playgroud)

我不需要确定邻接的位置,只是它是否存在.

目前,我不能比在矩阵中找到每个非零元素然后检查其4个侧翼元素做得更好.

感谢所有的好答案.

MSe*_*ert 6

如果你可以使用这将非常容易使用ndimage.labelndimage.labeled_comprehension:

import numpy as np
from scipy import ndimage

def multiple_unique_item(array):
    return len(np.unique(array)) > 1

def adjacent_diff(array):
    labeled_array, num_labels = ndimage.label(array)
    labels = np.arange(1, num_labels+1)
    any_multiple = ndimage.labeled_comprehension(array, labeled_array, labels, 
                                                 multiple_unique_item, bool, 0)
    return any_multiple.any()
Run Code Online (Sandbox Code Playgroud)

label默认为标记不包含对角线的0的相邻值.然后,理解将与标签关联的所有值传递给辅助函数 - 辅助函数检查是否存在多个唯一值.最后,它检查是否有任何标签有多个值并返回此值.

要在测试输入数组上测试它:

arr1 = np.array([[0,0,0,0,0,0,0,1],
                 [0,2,2,1,1,0,0,0],  
                 [0,0,2,0,0,0,0,0],
                 [0,0,0,0,0,0,0,0],
                 [0,3,3,0,0,0,0,0]])

arr2 = np.array([[0,0,0,1,1,1,1,1],
                 [0,2,2,0,1,0,0,0],
                 [0,0,2,0,0,0,0,0],  
                 [0,3,0,0,0,0,0,0],
                 [3,3,3,0,0,0,0,0]])

arr3 = np.array([[0,0,0,0,0,0,0,1],
                 [0,2,2,0,0,0,0,0],
                 [0,0,2,0,0,0,0,0],  
                 [0,0,0,0,0,0,0,0],
                 [0,3,3,0,0,0,0,0]])

>>> adjacent_diff(arr1)
True
>>> adjacent_diff(arr2)
False
>>> adjacent_diff(arr3)
False
Run Code Online (Sandbox Code Playgroud)