【问题标题】:Replicating the indices result of Matlab's ISMEMBER function in NumPy?在 NumPy 中复制 Matlab 的 ISMEMBER 函数的索引结果?
【发布时间】:2011-09-16 17:55:13
【问题描述】:

我一直在绞尽脑汁寻找与older question 类似的解决方案。我一直在尝试找到一个复制索引结果的 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 中,该数组的排序方式与 A 相同。我执行数据映射很多!我希望它适用于各种数据类型,尤其是字符串和日期时间。似乎 numpy 的 in1d 让我走到了一半。我也对其他 Pythonic 想法持开放态度!

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

谢谢!

【问题讨论】:

    标签: python matlab numpy


    【解决方案1】:
    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]
    

    【讨论】:

    • 你去!我没有时间继续研究我的答案。
    • 谢谢!这完全有效。还了解到 np.in1d 不适用于日期时间对象。
    猜你喜欢
    • 2014-11-13
    • 2011-04-18
    • 1970-01-01
    • 2013-03-29
    • 2018-08-09
    • 1970-01-01
    • 1970-01-01
    • 2022-08-08
    • 1970-01-01
    相关资源
    最近更新 更多