我有一個二維陣列:
[[1,2,0,0],
[4,0,9,4],
[0,0,1,0],
[4,6,9,0]]
是否有一種有效的方法(不使用回圈)將陣列中的每個第一個 0 替換為 1:
[[1,2,1,0],
[4,1,9,4],
[1,0,1,0],
[4,6,9,1]]
?
非常感謝 !
uj5u.com熱心網友回復:
因此,您可以使用np.where獲取陣列為 0 的行和列的索引:
In [45]: arr = np.array(
...: [[1,2,0,0],
...: [4,0,9,4],
...: [0,0,1,0],
...: [4,6,9,0]]
...: )
In [46]: r, c = np.where(arr == 0)
然后,使用np.unique獲取唯一的 x 值,這將對應于每行中的第一次出現,并使用獲取索引以提取相應的列值:0return_index
In [47]: uniq_val, uniq_idx = np.unique(r, return_index=True)
In [48]: arr[uniq_val, c[uniq_idx]] = 1
In [49]: arr
Out[49]:
array([[1, 2, 1, 0],
[4, 1, 9, 4],
[1, 0, 1, 0],
[4, 6, 9, 1]])
如果性能真的是一個問題,你可以寫一個numba函式,我懷疑這將非常適合numba
uj5u.com熱心網友回復:
這是一個受這個問題的公認答案啟發的單行代碼:
a = np.array([
[1, 2, 0, 0],
[4, 0, 9, 4],
[0, 0, 1, 0],
[4, 6, 9, 0]
])
a[range(len(a)), np.argmax(a == 0, axis=1)] = 1
uj5u.com熱心網友回復:
我不確定這是否有效,但至少比回圈好。我們搜索每行中的第一個 0,然后將其擴展到坐標并將其設定為 1。
filter = np.argmax(a == 0, axis=1)
f = np.column_stack((np.array(range(4)),filter))
a[[*f.T]] = 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/410472.html
標籤:
