我有一个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个侧翼元素做得更好.
感谢所有的好答案.
如果你可以使用scipy这将非常容易使用ndimage.label和ndimage.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)
| 归档时间: |
|
| 查看次数: |
1255 次 |
| 最近记录: |