如何在Python中实现matlabs``ismember()``命令?

2024-09-28 20:15:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我的问题是:我想创建一个布尔矩阵B,它包含True矩阵a在向量v中包含值的任何地方。一个不方便的解决方案是:

import numpy as np
>>> A = np.array([[0,1,2], [1,2,3], [2,3,4]])
array([[0, 1, 2],
       [1, 2, 3],
       [2, 3, 4]])
>>> v = [1,2]
>>> B = (A==v[0]) + (A==v[1]) # matlab: ``B = ismember(A,v)``
array([[False,  True,  True],
       [ True,  True, False],
       [ True, False, False]], dtype=bool)

如果a和v有更多的值,是否有一个更方便的解决方案?在

干杯!在


Tags: importnumpyfalsetrueas地方np矩阵
3条回答

使用numpy基元:

>>> import numpy as np
>>> A = np.array([[0,1,2], [1,2,3], [2,3,4]])
>>> v = [1,2]
>>> print np.vectorize(lambda x: x in v)(A)
[[False  True  True]
 [ True  True False]
 [ True False False]]

对于非微小输入,首先将v转换为一个集合,以获得较大的加速。在

使用numpy.setmember1d公司名称:

^{pr2}$

我知道的不多,这是一个原始的Python:

>>> A = [[0,1,2], [1,2,3], [2,3,4]]
>>> v = [1,2]
>>> B = [map(lambda val: val in v, a) for a in A]
>>>
>>> B
[[False, True, True], [True, True, False], [True, False, False]]

编辑:正如布鲁克斯·摩西(Brooks Moses)指出的,一些简单的时间安排似乎表明,这一点可能更好:

^{pr2}$

唉,setmember1d因为它存在于numpy中,当任何一个数组有重复的元素时(就像A在这里所做的那样)。下载this版本,称之为扫描电镜在你的某处搜索路径,向其添加第一行import numpy as nm,然后这将最终起作用:

>>> import sem
>>> print sem.setmember1d(A.reshape(A.size), v).reshape(A.shape)
[[False True True]
 [True True False]
 [True False False]]

注意不同之处wrt@Aants的相似答案:这个版本的结果bool数组的第二行是正确的,而他的版本(使用作为numpy一部分的setmember1d)错误地将第二行作为all Trues

相关问题 更多 >