如何实现matlab的成员(A,b),A是一个numpy ndarray而b是一个列表

时间:2015-03-12 16:24:54

标签: python arrays matlab list numpy

在python中实现matlab ismember(A, b)的最有效方法是什么?其中A是numpy ndarray,b是值列表。它应该返回一个掩码,作为与A相同形状的布尔ndarray,如果A中的相应值在b中的值列表中,则元素中的相应值为True。

我想用列表B中的值替换A中的所有元素。

我希望A[A in B] = 0能够正常工作,但会引发以下错误:

  

ValueError:具有多个元素的数组的真值   暧昧。使用a.any()或a.all()

如果存在等效ismember的实现,则以下内容将满足我的需求:

A[ismember(A, b)] = 0

注意:我不希望解决方案涉及在python中循环遍历A的所有元素。

根据ajcr的答案,一个解决方案是:

import numpy as np

def ismember(A, b):
  return np.in1d(A, b).reshape(A.shape)

但这很慢并且内存耗尽。对于我的情况,A是一个大到512 x 512 x 1200的图像.b有大约1000个元素。

2 个答案:

答案 0 :(得分:4)

您可能正在寻找np.in1d

>>> A = np.arange(9)
>>> B = [4, 6, 7]
>>> np.in1d(A, B)
array([False, False, False, False,  True, False,  True,  True, False])

请注意,对于多维数组A,输入是平坦的,因此您需要重新整形布尔数组:

>>> A = np.arange(9).reshape(3, 3)
>>> np.in1d(A, B).reshape(A.shape)
array([[False, False, False],
       [False,  True, False],
       [ True,  True, False]], dtype=bool)

答案 1 :(得分:0)

pypi中的ismember库可能会有用。

速度检查在这里完成:Python equivalent of MATLAB's "ismember" function

pip install ismember