簡體   English   中英

在另一個數組中按行搜索一個數組的元素 - Python / NumPy

[英]Search elements of one array in another, row-wise - Python / NumPy

例如,我有一個由唯一元素組成的矩陣,

a=[
    [1,2,3,4],
    [7,5,8,6]
]

和另一個唯一的矩陣,其中填充了出現在第一個矩陣中的元素。

b=[
    [4,1],
    [5,6]
]

我期待結果

[
    [3,0],
    [1,3]
].

也就是說,我想找到 b 的每一行元素等於同一行中 a 的某些元素,返回 a 中這些元素的索引。 我怎樣才能做到這一點? 謝謝。

這是一種矢量化方法 -

# https://stackoverflow.com/a/40588862/ @Divakar
def searchsorted2d(a,b):
    m,n = a.shape
    max_num = np.maximum(a.max() - a.min(), b.max() - b.min()) + 1
    r = max_num*np.arange(a.shape[0])[:,None]
    p = np.searchsorted( (a+r).ravel(), (b+r).ravel() ).reshape(m,-1)
    return p - n*(np.arange(m)[:,None])

def search_indices(a, b):
    sidx = a.argsort(1)
    a_s = np.take_along_axis(a,sidx,axis=1)
    return np.take_along_axis(sidx,searchsorted2d(a_s,b),axis=1)

樣品運行 -

In [54]: a
Out[54]: 
array([[1, 2, 3, 4],
       [7, 5, 8, 6]])

In [55]: b
Out[55]: 
array([[4, 1],
       [5, 6]])

In [56]: search_indices(a, b)
Out[56]: 
array([[3, 0],
       [1, 3]])

另一個利用broadcasting矢量化 -

In [65]: (a[:,None,:]==b[:,:,None]).argmax(2)
Out[65]: 
array([[3, 0],
       [1, 3]])

如果您不介意使用循環,這里有一個使用 np.where 的快速解決方案:

import numpy as np

a=[[1,2,3,4],
   [7,5,8,6]]
b=[[4,1],
   [5,6]]

a = np.array(a)
b = np.array(b)
c = np.zeros_like(b)

for i in range(c.shape[0]):
    for j in range(c.shape[1]):
        _, pos = np.where(a==b[i,j])
        c[i,j] = pos

print(c.tolist())

你可以這樣做:

np.split(pd.DataFrame(a).where(pd.DataFrame(np.isin(a,b))).T.sort_values(by=[0,1])[::-1].unstack().dropna().reset_index().iloc[:,1].to_numpy(),len(a))                               

# [array([3, 0]), array([1, 3])]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM