[英]Numpy array: how to row-wise check if first X amount of values are valid?
考慮以下兩個示例數組:
arr = np.array([
[5.0, 2.0, 1.0, np.nan, np.nan],
[9.0, np.nan, np.nan, np.nan, 2.0],
[4.0, 7.0, 4.0, np.nan, np.nan],
[8.0, np.nan, np.nan, np.nan, np.nan],
[np.nan, np.nan, np.nan, np.nan, np.nan],
[np.nan, np.nan, np.nan, np.nan, 6.0]
])
amounts = np.array([
3,
1,
2,
3,
0,
5
])
對於數組arr
每一行,我想檢查該行中的前X個條目是否不是NaN
,但其他所有條目都是NaN
。 對於每一行,此數量X是不同的,並由數組amounts
給出。
因此,我的預期結果將是以下布爾數組:
array([ True, False, False, False, True, False])
我設法提出了以下工作代碼:
result = []
for (row, amount) in zip(arr, amounts):
if (~np.isnan(row)[:amount]).all() and np.isnan(row)[amount:].all():
result.append(True)
else:
result.append(False)
result = np.array(result)
print(result)
盡管此代碼產生了預期的結果,但我仍然覺得它仍然效率低下。 我懷疑沒有任何for循環的方法是可能的,但是我還沒有找到它。
誰能為這個問題找到一個完全矢量化的解決方案?
a = np.array([[5.0, 2.0, 1.0, np.nan, np.nan],
[9.0, np.nan, np.nan, np.nan, 2.0],
[4.0, 7.0, 4.0, np.nan, np.nan],
[8.0, np.nan, np.nan, np.nan, np.nan],
[np.nan, np.nan, np.nan, np.nan, np.nan],
[np.nan, np.nan, np.nan, np.nan, 6.0]])
b = np.array([3,1,2,3,0,5])
c = np.logical_not(np.isnan(a))
firstn = b == c.argmin(axis=1)
no_extras = b == c.sum(axis=1)
result = np.logical_and(firstn,no_extras)
制作一個非NaN值的布爾數組。
確保前n
值符合條件; 使用numpy.argmin()
查找第一個NaN
-與比較這counts
陣列。
確保在NaN 開始 后沒有任何非NaN值; 將布爾數組中所有True
行求和,然后將其與counts
數組進行比較。
and
這兩個結果。
您可以這樣嘗試:
# Values are column numbers
grid = np.tile(np.arange(arr.shape[1]), (arr.shape[0], 1))
# Mask
mask = grid < amounts.reshape((-1, 1))
# Comparison
np.all(~np.isnan(arr) == mask, axis=1)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.