我有 np 2d 陣列(稱為 old_array),如下所示:
1 2 3 4 5 6 7 8 9
4 3 5 1 6 7 3 2 8
8 3 4 1 8 3 2 9 3
7 3 5 8 2 5 9 2 6
嘗試僅選擇大于 4 的值并希望得到如下輸出:
5 6 7 8 9
5 6 7 8
8 8 9
7 5 8 5 9 6
我試圖使用 new_array = old_array[old_array>4] 但沒有得到想要的解決方案。任何解釋我做錯了什么,或者應該如何做。如果可能的話,還要盡量避免回圈。
謝謝。
uj5u.com熱心網友回復:
如果這些陣列是 NumPy 陣列,并且您想獲取元素的索引而不是 4,則可以使用
np.argwhere(array > 4)
此函式回傳另一個陣列,其中包含條件為 True 的原始陣列的索引。
np.argwhere(array>4)
array([[0, 4],
[0, 5],
[0, 6],
[0, 7],
[0, 8],
[1, 2],
[1, 4],
[1, 5],
[1, 8],
[2, 0],
[2, 4],
[2, 7],
[3, 0],
[3, 2],
[3, 3],
[3, 5],
[3, 6],
[3, 8]])
否則
array>4
array([[False, False, False, False, True, True, True, True, True],
[False, False, True, False, True, True, False, False, True],
[ True, False, False, False, True, False, False, True, False],
[ True, False, True, True, False, True, True, False, True]])
在這種情況下,您將獲得一個可以回圈遍歷的掩碼。
希望它有效
uj5u.com熱心網友回復:
你正試圖強迫numpy以一種不是為它設計的方式作業。它不適用于包含長度不等的行的陣列。
現在,正如您所了解的那樣,您仍然可以使用它來完成它,np.split但這通常很慢。
這是一種方法:
x = np.array([[1, 2, 3, 4, 5, 6, 7, 8, 9], [4, 3, 5, 1, 6, 7, 3, 2, 8], [8, 3, 4, 1, 8, 3, 2, 9, 3], [7, 3, 5, 8, 2, 5, 9, 2, 6]])
trues = x > 4
row_lengths = np.sum(trues, axis=1)
split_idx = np.cumsum(row_lengths[:-1])
>>> np.split(x[trues], split_idx)
[array([5, 6, 7, 8, 9]),
array([5, 6, 7, 8]),
array([8, 8, 9]),
array([7, 5, 8, 5, 9, 6])]
還有一些測驗解釋了它是如何作業的:
>>> trues
array([[False, False, False, False, True, True, True, True, True],
[False, False, True, False, True, True, False, False, True],
[ True, False, False, False, True, False, False, True, False],
[ True, False, True, True, False, True, True, False, True]])
>>> x[trues]
array([5, 6, 7, 8, 9, 5, 6, 7, 8, 8, 8, 9, 7, 5, 8, 5, 9, 6])
>>> row_lengths
array([5, 4, 3, 6])
>>> split_idx
array([ 5, 9, 12], dtype=int32)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/412616.html
標籤:
