python中的matlab ismember函数

2024-09-28 20:15:50 发布

您现在位置:Python中文网/ 问答频道 /正文

虽然类似的问题已经提过好几次了,但是我仍然不能在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]

有人知道吗?多谢提前。


Tags: 函数inforsizenpzeros情况矩阵
3条回答

为了回答您的问题,我想您可以将ismember定义为类似于:

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

但我不熟悉纽比,所以可能需要稍作调整。

我想您也可以使用集合中的计数器:

>>> 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)

尝试以下功能:

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

这应该非常像对应的MALTAB函数。

与其他答案不同的是,numpy有内置的numpy.in1d来实现这一点。

在您的案例中的用法:

bool_array = numpy.in1d(array1, array2)

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

相关问题 更多 >