簡體   English   中英

在 2D 和 1D 數組之間按元素使用 numpy

[英]Using numpy isin element-wise between 2D and 1D arrays

我有一個非常簡單的場景,我想測試一個二維數組的兩個元素是否(分別)是一個更大數組的成員——例如:

full_array = np.array(['A','B','C','D','E','F'])
sub_arrays = np.array([['A','C','F'],
                       ['B','C','E']])
np.isin(full_array, sub_arrays)

這給了我一個單一維度的輸出:

array([ True,  True,  True, False,  True,  True])

顯示 full_array 的元素是否存在於兩個子數組中的任何一個中。 我想要一個二維數組,為 sub_arrays 中的兩個元素中的每一個顯示相同的東西 - 所以:

array([[ True,  False,  True, False,  False,  True],
       [ False, True,   True, False,  True,  False]])

希望這是有道理的,並感激地收到任何幫助。

廣播基礎一

一個簡單的方法是在擴展其中一個陣列之后進行broadcasting ,然后沿相應的軸進行任何縮減 -

In [140]: (full_array==sub_arrays[...,None]).any(axis=1)
Out[140]: 
array([[ True, False,  True, False, False,  True],
       [False,  True,  True, False,  True, False]])

隨着searchsorted

具體案例 #1

full_array進行排序並且 sub_arrays 中的所有元素至少出現在sub_arraysfull_array ,我們還可以使用np.searchsorted -

idx = np.searchsorted(full_array, sub_arrays)
out = np.zeros((sub_arrays.shape[0],len(full_array)),dtype=bool)
np.put_along_axis(out, idx, 1, axis=1)

具體案例#2

full_array進行排序后,如果不能保證來自sub_arrays的所有元素至少出現在full_array的某處,我們需要一個額外的步驟 -

idx = np.searchsorted(full_array, sub_arrays)
idx[idx==len(full_array)] = 0
out = np.zeros((sub_arrays.shape[0],len(full_array)),dtype=bool)
np.put_along_axis(out, idx, full_array[idx] == sub_arrays, axis=1)

通用案例

對於不一定要排序的full_array的真正通用情況,我們需要使用searchsorted sorter

def isin2D(full_array, sub_arrays):
    out = np.zeros((sub_arrays.shape[0],len(full_array)),dtype=bool)
    sidx = full_array.argsort()
    idx = np.searchsorted(full_array, sub_arrays, sorter=sidx)
    idx[idx==len(full_array)] = 0
    idx0 = sidx[idx]
    np.put_along_axis(out, idx0, full_array[idx0] == sub_arrays, axis=1)
    return out

樣品運行 -

In [214]: full_array
Out[214]: array(['E', 'F', 'A', 'B', 'D', 'C'], dtype='|S1')

In [215]: sub_arrays
Out[215]: 
array([['Z', 'C', 'F'],
       ['B', 'C', 'E']], dtype='|S1')

In [216]: isin2D(full_array, sub_arrays)
Out[216]: 
array([[False,  True, False, False, False,  True],
       [ True, False, False,  True, False,  True]])

暫無
暫無

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

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