在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个元素。
答案 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