matlab中的matlab ismember函数

时间:2014-09-18 21:53:55

标签: python numpy

虽然类似的问题已经提出了几次,但我仍然无法在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]

有人有任何想法吗?非常感谢提前。

4 个答案:

答案 0 :(得分:7)

与其他答案相比,numpy有内置的numpy.in1d来做这件事。

在您的情况下使用:

  if (isset($arr["transporters"])) {

       foreach ($arr["transporters"] as $other) {
            $model = new YourModel(); // add new model 
            $model->company_name = $other["transportername"];
            ..... 
            $model->others_column  // remdeber to properly populated  with all the value you needd
            .......
            if($model->save()){
            $allsaved = true;
             }

        }
        if($allsaved){
            return ['data' => "Successifully created"];
        }else{
            return ['data' => "Sorry an error occured when saving the transporters"];
        }
    }

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

答案 1 :(得分:2)

要回答你的问题,我猜你可以用以下方式定义一个ismember:

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

但是我对numpy并不熟悉,所以可能会有一点调整。

我猜你也可以使用收藏中的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)

答案 2 :(得分:1)

尝试以下功能:

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

这应该与相应的Matlab函数非常相似。

答案 3 :(得分: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]