如何实现 matlab 的 ismember(A, b),其中 A 是一个 numpy ndarray,b 是一个列表



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

最新更新