如何在2D numpy数组中识别/查找1D numpy数组模式?

时间:2019-06-26 16:12:58

标签: python numpy

我有一个2D numpy数组,正在尝试查找与1D数组相等的条目,但是这两个数组的尺寸禁止广播。具体来说,我的2D数组就像300x400,我想看看它在哪里等于2个元素的行向量[1, -1]

我正在尝试查找图像中分割边界上像素的位置。在此蒙版中,这表示为1与前景相邻,而-1与背景相邻。所以我需要找到[1,-1]出现在掩码行中的位置,比方说a

我尝试过a == [1,-1],但这只是执行对象级相等并返回False

我想我可以用

for i in range(a.shape[0]): 
    for j in range(a.shape[1]-1): 
        if a[i,j] == 1: 
            if a[i,j+1] == -1: 
                print(i)

但是没有一些可爱的方法可以使用numpy方法或其他方法来做到这一点吗?我讨厌循环

3 个答案:

答案 0 :(得分:1)

localhost/phpmailer test/index.php

给予

arr = np.array([[1,1,-1],[1,-1,-1]])
arr_idx = (arr==1)[:,:-1] & (arr==-1)[:,1:]

这是满足您条件的事物的索引。请注意,它的形状比输入矩阵少一列(出于明显的原因)。

您可以在一侧或另一侧添加一列,以将索引更改为要查找的对的任一侧。

>>> arr_idx
array([[False,  True],
       [ True, False]])

在左侧选中一个新列会给出该对中-1分量的索引。

答案 1 :(得分:0)

您可以为此使用2D互相关。

为此,scipy中有一个函数:signal.correlate2d()

import numpy as np
from scipy import signal

arr = np.array([[1,1,-1],
                [1,-1,-1]])

# the pattern you are looking for, has to be 2d
krn = np.array([[1,-1]]) 

res = signal.correlate2d(arr, krn, mode='same')

print(res)

结果是

[[ 0  2 -1]
 [ 2  0 -1]]

越高,匹配度越高。在您的情况下,2表示找到您的图案的位置。

答案 2 :(得分:0)

检查从第一个索引开始的1(删除最后一个,因为后面不能有-1)

 tmp1 = a[:,0:-1]
 t1 = tmp1==1

t1在任何偏移a为1的地方均为True 从第一个索引到最后一个索引检查-1

  tmp2 = a[:,1:]
  t2 = tmp2 ==-1

t1和t2包含True和False(根据您的目标移动) t1 * t2将在满足条件的行中为您提供True。对行进行汇总后,每个行索引i都会得到大于零的数字

res = np.sum(t1*t2,axis=1) 
desired_Indices = np.where(res>0)

...每个人都讨厌循环;)