[英]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.any
或x.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.