python中实现matlab的ismember(A,b)的最有效方法是什么,其中A是任何numpy ndarray,b是值列表。它应该返回一个掩码作为与 A 形状相同的布尔 ndarray 如果 A 中的相应值在 b 中的值列表中,则元素中的 True 为 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 个元素。
正在寻找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)
pypi 中的ismember
库可能很有用。
速度检查在这里完成:Python相当于MATLAB的"ismember"函数
pip install ismember