【问题标题】:Create a boolean array A from two 1-D vectors a, b, and A[i,j] is True if a[i]==b[j]从两个一维向量 a、b 和 A[i,j] 创建一个布尔数组 A,如果 a[i]==b[j]
【发布时间】:2020-01-02 17:35:11
【问题描述】:

给定两个numpy向量ab,如果a[i]==b[j],我想创建一个二维数组AA[i,j]=True。我可以执行以下 for 循环。但是我想知道我是否可以在没有for循环的情况下更快地获得结果。

def f(x, y):
    d = np.zeros((len(x),len(y)))
    for i in range(len(x)):
        d[i, np.argwhere(y==x[i])]=1
    return d
a = np.array([1,2,3,1,3,4])
b = np.array([1,1,2,2,2,3,4,5])

f(a,b) 是:

array([[1., 1., 0., 0., 0., 0., 0., 0.],
       [0., 0., 1., 1., 1., 0., 0., 0.],
       [0., 0., 0., 0., 0., 1., 0., 0.],
       [1., 1., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 1., 0., 0.],
       [0., 0., 0., 0., 0., 0., 1., 0.]])

【问题讨论】:

    标签: python numpy numpy-ndarray array-broadcasting


    【解决方案1】:
    In [296]: a = np.array([1,2,3,1,3,4]) 
         ...: b = np.array([1,1,2,2,2,3,4,5])                                       
    In [297]: a[:,None]==b                                                          
    Out[297]: 
    array([[ True,  True, False, False, False, False, False, False],
           [False, False,  True,  True,  True, False, False, False],
           [False, False, False, False, False,  True, False, False],
           [ True,  True, False, False, False, False, False, False],
           [False, False, False, False, False,  True, False, False],
           [False, False, False, False, False, False,  True, False]])
    In [298]: _.astype(int)                                                         
    Out[298]: 
    array([[1, 1, 0, 0, 0, 0, 0, 0],
           [0, 0, 1, 1, 1, 0, 0, 0],
           [0, 0, 0, 0, 0, 1, 0, 0],
           [1, 1, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 1, 0, 0],
           [0, 0, 0, 0, 0, 0, 1, 0]])
    

    where:

    In [301]: d=np.zeros((len(a),len(b)),int)                                       
    In [302]: np.where(a[:,None]==b)                                                
    Out[302]: (array([0, 0, 1, 1, 1, 2, 3, 3, 4, 5]), array([0, 1, 2, 3, 4, 5, 0, 1, 5, 6]))
    In [303]: d[_]=1                                                                
    In [304]: d                                                                     
    Out[304]: 
    array([[1, 1, 0, 0, 0, 0, 0, 0],
           [0, 0, 1, 1, 1, 0, 0, 0],
           [0, 0, 0, 0, 0, 1, 0, 0],
           [1, 1, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 1, 0, 0],
           [0, 0, 0, 0, 0, 0, 1, 0]])
    

    【讨论】:

    • 谢谢!这正是我想要的。
    猜你喜欢
    • 1970-01-01
    • 2021-11-01
    • 2021-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    相关资源
    最近更新 更多