我有一個代表列的 numpy 一維數字陣列,例如:[0,0,2,1]
和一個矩陣,例如:
[[1,1,1],
[1,1,1],
[1,1,1],
[1,1,1]]
現在我想將矩陣中的值更改為 0,其中列索引大于一維陣列中給定的值:
[[1,0,0],
[1,0,0],
[1,1,1],
[1,1,0]]
我怎樣才能做到這一點?我想我需要一個基于索引的條件,而不是值
說明:矩陣中的第一行具有索引 [0,0 ; 0,1 ; 0,2] 其中第二個索引是列。對于指數 0,0 ; 0,1 和 0,2 給出值 0。1 和 2 都大于 0。因此只有 0,0 不會變為零。
uj5u.com熱心網友回復:
假設a二維陣列和v一維向量,您可以創建相同大小的掩碼并使用numpy.where:
x,y = a.shape
np.where(np.tile(np.arange(y), (x,1)) <= v[:,None], a, 0)
輸入:
a = np.array([[1,1,1],
[1,1,1],
[1,1,1],
[1,1,1]])
v = np.array([0,0,2,1])
輸出:
array([[1, 0, 0],
[1, 0, 0],
[1, 1, 1],
[1, 1, 0]])
中間體:
>>> np.tile(np.arange(y), (x,1))
[[0 1 2]
[0 1 2]
[0 1 2]
[0 1 2]]
>>> np.tile(np.arange(y), (x,1)) <= v[:,None]
[[ True False False]
[ True False False]
[ True True True]
[ True True False]]
uj5u.com熱心網友回復:
構造一個二維陣列,其元素為對應的列索引,然后屏蔽大于一維陣列對應值的元素。
利用廣播,您可以:
>>> arr = np.ones((4,3))
>>> arr
array([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
>>> col_thr_idx = np.array([0,0,2,1])
>>> col_thr_idx
array([0, 0, 2, 1])
>>> mask = np.arange(arr.shape[1])[None,:] > col_thr_idx[:,None]
>>> mask
array([[False, True, True],
[False, True, True],
[False, False, False],
[False, False, True]])
>>> arr[mask] = 0
>>> arr
array([[1., 0., 0.],
[1., 0., 0.],
[1., 1., 1.],
[1., 1., 0.]])
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/350860.html
