【问题标题】:numpy where condition on indexnumpy where 索引条件
【发布时间】:2021-11-06 20:00:20
【问题描述】:

我有一个代表列的 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 不会变为零。

【问题讨论】:

  • 列索引 (2) 大于索引为 2 的列中的所有值。那你为什么不把所有的 1 都改成 0 呢?
  • @zabop 其中列 index 较大,对于第一行 [1,1,1] 我们有数字 0。在这一行中我们有索引为 0 的数字,0 ; 0,1 和 0,2 第一个索引没有列 > 0,其他索引有。 0,1 和 0,2 中的 1 和 2 大于 0。

标签: python numpy


【解决方案1】:

假设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]]

【讨论】:

  • 感谢您的回答,这有效!我接受了你的回答,因为细节清晰,两个班轮简单,中间步骤清晰。
【解决方案2】:

构造一个二维数组,其元素为对应的列索引,然后屏蔽大于一维数组对应值的元素。

利用广播,您可以:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-31
    • 1970-01-01
    • 2023-02-21
    • 2016-01-15
    • 2015-04-29
    • 2013-04-26
    • 2016-12-21
    相关资源
    最近更新 更多