【问题标题】:How to set the smallest k values of each row of Numpy array to 0?如何将Numpy数组每一行的最小k值设置为0?
【发布时间】:2021-03-04 09:38:30
【问题描述】:

我想将每行中最小的 k 值设置为 0,而不使用 for 循环。 这是我的带有 for 循环的代码:

import numpy as np
k = 2
sims = np.array([[3,1,2,9],[5,9,1,7],[1,8,6,2], [1,5,8,9]])
for i in range(len(sims)):
    indices_argsort = np.argsort(sims[i]) 
    sims[i, indices_argsort[: -k]] = 0
print(sims)

输出是:

array([[3, 0, 0, 9],
       [0, 9, 0, 7],
       [0, 8, 6, 0],
       [0, 0, 8, 9]])

在输出中,可以将最小的 k 值设置为 0。但是在处理大型矩阵时,使用 forloop 是不好的。那么,有没有不使用forloop也能解决的方案呢?

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    使用

    mask = np.apply_along_axis(lambda x: x < np.partition(x, k)[k], 1, sims)
    sims[mask] = 0
    

    输出

    array([[3, 0, 0, 9],
           [0, 9, 0, 7],
           [0, 8, 6, 0],
           [0, 0, 8, 9]])
    

    【讨论】:

      【解决方案2】:

      我用广播机制解决了如下:

      import numpy as np
      sims = np.array([[3,1,2,9],[5,9,1,7],[1,8,6,2], [1,5,8,9]])
      indices_argsort = np.argsort(sims , axis = -1)
      
      k = 2
      
      sims[np.arange(4)[:,None], indices_argsort[:,:-k]] = 0
      print(sims)
      

      输出:

      array([[3, 0, 0, 9],
             [0, 9, 0, 7],
             [0, 8, 6, 0],
             [0, 0, 8, 9]])
      

      【讨论】:

      • indices_argsort 是什么
      • @Vishnudev 我已经更新了,谢谢。看了你的回答,不知道哪个效率更高,速度更快?
      • 您的答案很可能会更快。另外,为什么要使用负值?只需使用axis=1[:, :k]
      猜你喜欢
      • 2019-07-30
      • 1970-01-01
      • 2022-12-12
      • 1970-01-01
      • 2016-05-26
      • 2019-05-22
      • 1970-01-01
      • 2017-03-22
      • 2012-01-29
      相关资源
      最近更新 更多