Python中的MATLAB ismember函数

3
虽然类似的问题已经被提出了几次,但我仍然不能在Python中编写类似于Matlab的ismember函数。特别是,我想在循环中使用此函数,并在每次迭代中将整个矩阵与另一个矩阵的元素进行比较。当出现相同的值时,我想打印1,在任何其他情况下都为0。
假设我有以下矩阵:
d = np.reshape(np.array([ 2.25,  1.25,  1.5 ,  1.  ,  0.  ,  1.25,  1.75,  0.  ,  1.5 ,  0.  ]),(1,10))
d_unique = np.unique(d)

然后我有...
d_unique
array([ 0.  ,  1.  ,  1.25,  1.5 ,  1.75,  2.25])

现在我想要进行迭代,类似于:
J = np.zeros(np.size(d_unique))
for i in xrange(len(d_unique)):
        J[i] = np.sum(ismember(d,d_unique[i]))

为了作为输出,应该这样做:
J = [3,1,2,2,1,1]

有人有什么想法吗?非常感谢提前。


1
这个问题的答案是否有帮助?链接 - user707650
相关链接:https://dev59.com/5kjSa4cB1Zd3GeqPJOCt?rq=1 - user707650
1
这个回答解决了你的问题吗?Python中与MATLAB的“ismember”函数相对应 - Cris Luengo
@user707650 没有帮助。 - SteveTz
4个回答

15

与其他答案不同的是,numpy有内置的numpy.in1d可用于执行此操作。

在您的情况下使用:

bool_array = numpy.in1d(array1, array2)

注意:它也接受列表作为输入。

编辑(2021):numpy现在建议使用np.isin代替np.in1dnp.isin保留了输入数组的形状,而np.in1d返回一个扁平化的输出。


1
它返回布尔值而不是索引。 - Zanam
1
@Zanam,Matlab API 还返回ismember的布尔向量。此外,将 ismember=np.in1d 设置并执行问题代码会获得正确答案。 - Yuval Atzmon
2
@YuvalAtzmon,Matlab函数有第二个(可选)输出,返回位置信息,这似乎是OP感兴趣的。 - goryh

2
为了回答你的问题,我猜你可以这样定义一个ismember:

为了回答你的问题,我猜你可以这样定义一个ismember:

def ismember(d, k):
  return [1 if (i == k) else 0 for i in d]

但我并不熟悉numpy,所以可能需要进行一些调整。

我想你也可以使用collections的Counter:

>>> from collections import Counter
>>> a = [2.25,  1.25,  1.5,  1.,  0.,  1.25,  1.75,  0.,  1.5,  0. ]
>>> Counter(a)
Counter({0.0: 3, 1.25: 2, 1.5: 2, 2.25: 1, 1.0: 1, 1.75: 1})
>>> Counter(a).keys()
[2.25, 1.25, 0.0, 1.0, 1.5, 1.75]
>>> c =Counter(a)
>>> [c[i] for i in sorted(c.keys())]
[3, 1, 2, 2, 1, 1]

再次强调,这里不是numpy,你可能需要在某个地方执行list(d)操作。


非常感谢,使用你的第二个例子效果真的很不错。第一个例子正是我想做的,但最终出现了以下警告:“ValueError:一个具有多个元素的数组的真值是模糊的。请使用a.any()或a.all()。”我不明白这可能意味着什么。 - GioR
@ gioR 当尝试使用您的代码时,我必须使用 d[0] 而不是简单地使用 d - fredtantini

1
尝试以下函数:

def ismember(A, B):
    return [ np.sum(a == B) for a in A ]

这应该非常类似于相应的MATLAB函数。

最后,这其实非常简单。但是,为什么numpy不逐个比较数字呢?当我尝试遍历整个矩阵时,出现了以下警告:“ValueError:具有多个元素的数组的真值是模棱两可的。使用a.any()或a.all()”。 - GioR
2
numpy内置了一个函数,为什么要使用速度较慢的列表推导式?我在下面添加了一个答案。 - Yuval Atzmon

0

尝试使用pypi中的ismember库。

pip install ismember

例子:

# Import library
from ismember import ismember

# data
d = [ 2.25,  1.25,  1.5 ,  1.  ,  0.  ,  1.25,  1.75,  0.  ,  1.5 ,  0.  ]
d_unique = [ 0.  ,  1.  ,  1.25,  1.5 ,  1.75,  2.25]

# Lookup
Iloc,idx = ismember(d, d_unique)
 
# Iloc is boolean defining existence of d in d_unique
print(Iloc)
# [[True  True  True  True  True  True  True  True  True  True]]

# indexes of d_unique that exists in d
print(idx)
# array([5, 2, 3, 1, 0, 2, 4, 0, 3, 0], dtype=int64)

print(d_unique[idx])
array([2.25, 1.25, 1.5 , 1.  , 0.  , 1.25, 1.75, 0.  , 1.5 , 0.  ])

print(d[Iloc])
array([2.25, 1.25, 1.5 , 1.  , 0.  , 1.25, 1.75, 0.  , 1.5 , 0.  ])

# These vectors will match
d[Iloc]==d_unique[idx]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接