在NumPy中复现Matlab的ISMEMBER函数的索引结果?

3 投票
1 回答
1664 浏览
提问于 2025-04-17 02:27

我一直在思考一个解决方案,类似于这个旧问题。我想找到一种Python代码模式,可以复制出索引的结果。例如:

A = [3;4;4;3;6]
B = [2;5;2;6;3;2;2;5]
[tf ix] = ismember(A,B)
>> A(tf)

ans =

     3
     3
     6
>> B(ix(tf))

ans =

     3
     3
     6

这样做的好处是,如果有一个数组C,它的顺序和数组B一样,我就可以把C中的值正确地插入到一个新的数组D中,而这个数组D的顺序和数组A是一样的。我经常需要进行这样的数据映射!我希望这个方法能适用于各种数据类型,特别是字符串和日期时间。我觉得numpy的in1d能让我走到一半的路。我也愿意尝试其他Python的好主意!

D(tf) = C(ix(tf))

谢谢!

1 个回答

5

在编程中,有时候我们会遇到一些问题,比如代码运行不正常或者出现错误。这种情况可能是因为我们写的代码有问题,或者是我们使用的工具和环境不兼容。解决这些问题通常需要我们仔细检查代码,看看哪里出错了。

另外,很多时候我们可以在网上找到别人遇到类似问题的解决方案,比如在StackOverflow这样的论坛上。这里有很多程序员分享他们的经验和解决办法,我们可以从中学习到很多有用的知识。

总之,编程是一项需要不断学习和实践的技能,遇到问题时不要气馁,积极寻找解决方案,慢慢就能掌握它。

import numpy as np

A = np.array([3,4,4,3,6])
B = np.array([2,5,2,6,3,6,2,2,5])

def ismember(a, b):
    # tf = np.in1d(a,b) # for newer versions of numpy
    tf = np.array([i in b for i in a])
    u = np.unique(a[tf])
    index = np.array([(np.where(b == i))[0][-1] if t else 0 for i,t in zip(a,tf)])
    return tf, index

tf,ix=ismember(A,B)
print(tf)
# [ True False False  True  True]
print(ix)
# [4 0 0 4 5]
print(A[tf])
# [3 3 6]
print(B[ix[tf]])
# [3 3 6]

撰写回答