簡體   English   中英

numpy數組:如何按行檢查前X個值是否有效?

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

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