在NumPy中复现Matlab的ISMEMBER函数的索引结果?
我一直在思考一个解决方案,类似于这个旧问题。我想找到一种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]