簡體   English   中英

Select Numpy 數組中的所有行,其中每列滿足某些條件

[英]Select all rows from Numpy array where each column satisfies some condition

我有一個數組x的形式,

x = [[1,2,3,...,7,8,9],
[1,2,3,...,7,9,8],
...,
[9,8,7,...,3,1,2],
[9,8,7,...,3,2,1]]

我還為每列提供了一組不允許的數字。 我想 select 所有在每列中只允許字符的行。 例如,我可能只想要第一列中沒有[1,2,3]的行; 我可以做到這一點,

x[~np.in1d(x[:,0], [1,2,3])]

對於任何單列,我都可以做到這一點。 但我希望基本上一次對所有列執行此操作,只選擇每個元素都是其列的允許編號的行。 我似乎無法讓x.anyx.all做好這件事 - 我應該如何處理這個問題?

編輯:為了澄清,每列不允許的數字是不同的。 實際上,我會有一些數組 y,

y = [[1,4,...,7,8],
[2,5,...,9,4],
[3,6,...,8,6]]

我想要x中的行,其中第 1 列不能在[1,2,3]中,第 2 列不能在[4,5,6]中,依此類推。

您可以廣播比較,然后all檢查:

x[(x != y[:,None,:]).all(axis=(0,-1))]

分解:

# compare each element of `x` to each element of `y`
# mask.shape == (y.shape[0], x.shape[0], x.shape[1])
mask = (x != y[:,None,:])

# `all(0)` checks, for each element in `x`, it doesn't match any element in the same column of `y`
# `all(-1) checks along the rows of `x`
mask = mask.all(axis=(0,-1)

# slice
x[mask]

例如,考慮:

x = np. array([[1, 2],
       [9, 8],
       [5, 6],
       [7, 8]])

y = np.array([[1, 4],
       [2, 5],
       [3, 7]])

然后mask = (x:= y[,,None:.]),all(axis=(0,1))給出

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

這些天建議使用np.isin而不是np.in1d 這使您可以 (a) 一次比較整個數組,並且 (b) 更有效地反轉掩碼。

x[np.isin(x, [1, 2, 3], invert=True).all(1)]

np.isin保留x的形狀,因此您可以在列中使用.all 它還有一個invert參數,可以讓您執行相當於~isin(x, [1, 2, 3])的操作,但效率更高。

該解決方案將類似的計算向量化為另一個更有效的建議(盡管它仍然是線性搜索),並且還避免創建臨時 arrays。

暫無
暫無

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

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