索引上的NumPy WHERE条件

dxxyhpgq  于 2022-11-10  发布在  其他
关注(0)|答案(2)|浏览(136)

我有一个数字的一维数组,表示列,例如:[0,0,2,1]和一个矩阵,例如:

[[1,1,1],
[1,1,1],
[1,1,1],
[1,1,1]]

现在我想将矩阵中的值更改为0,其中列索引大于1D数组中给出的值:

[[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不变为零。

kd3sttzy

kd3sttzy1#

假设a是2D数组,v是1D向量,则可以创建相同大小的遮罩并使用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]]
zrfyljdw

zrfyljdw2#

构造元素为对应列索引的二维数组,然后对大于一维数组的对应值的元素进行掩码。
利用广播优势,您可以做到:

>>> 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.]])

相关问题