我有一个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方法或其他方法来做到这一点吗?我讨厌循环
答案 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)
...每个人都讨厌循环;)