替换所有小于每行中“n”个最大项目的numpy数组值

Posted

技术标签:

【中文标题】替换所有小于每行中“n”个最大项目的numpy数组值【英文标题】:Replacing all values of numpy array which are smaller than the "n" largest item in each row 【发布时间】:2018-01-30 15:32:45 【问题描述】:

我有一个大小为 ~70k * 10k 的 2d numpy 数组。我想用零替换每行中小于“N”最大元素的所有值。例如:

arr = np.array([[1, 0, 6, 5, 2, 5], 
                [7, 5, 2, 6, 7, 3], 
                [3, 5, 1, 5, 6, 4]])

对于N = 3,结果应该是:

result = np.array([[0, 0, 6, 5, 0, 5], # 3 largest in row: 6, 5, 5
                   [7, 0, 0, 6, 7, 0], 
                   [0, 5, 0, 5, 6, 0]])

未被替换的数字的位置和数组的形状应该保持不变。

【问题讨论】:

您自己尝试过什么吗?对如何去做有任何想法吗? 也有类似***.com/questions/30332908/… 这样的问题,但是 np.partition 改变了数组的形状,这是我必须避免的。 我得到的第三个谷歌结果是this。应该足以让您入门。 你的第三个谷歌结果大约是一个特定的值 (255)。我需要独立确定每一行的 N 最大值,因为在每一行中它们可能不同。我想找到最优雅的解决方案。 同一个数组但 N=2 的结果应该是什么?即如何处理重复? 【参考方案1】:

您可以使用np.partition 找到N-th 最大值,然后只需使用布尔索引来替换该行中“低于”该值的所有内容:

import numpy as np
arr = np.array([[1, 0, 6, 5, 2, 5], 
                [7, 5, 2, 6, 7, 3], 
                [3, 5, 1, 5, 6, 4]])

N = 3
nlargest = np.partition(arr, -N, axis=1)[:, -N]
arr[arr < nlargest[:, None]] = 0
arr
# array([[0, 0, 6, 5, 0, 5],
#        [7, 0, 0, 6, 7, 0],
#        [0, 5, 0, 5, 6, 0]])

【讨论】:

以上是关于替换所有小于每行中“n”个最大项目的numpy数组值的主要内容,如果未能解决你的问题,请参考以下文章

如何在numpy中找到每行中最大的索引,行的串联?

在 numpy 数组中查找最大 N 个元素的快速方法

一种在 numpy 数组中查找最大 N 个元素的快速方法

如何找到 Numpy 数组的 M 个元素的 N 个最大乘积子数组?

ndarray每行N个最大值

NumPy统计函数