在numpy中替换前10个值

时间:2018-02-07 13:10:08

标签: python sorting numpy

有没有简单的方法可以用1替换前10个值,用零替换其余值?我发现numpy argpartition可以给我一个带索引的新数组,但我还没有能够在原始数组中轻松使用它? 有人可以帮忙吗? 在此先感谢

4 个答案:

答案 0 :(得分:2)

您可以使用np.sort找到第10个最大值,然后使用np.where标记数组。

import numpy as np

a = np.random.rand(30)

a_10 = np.sort(a)[-10]

a_new = np.where(a >= a_10, 1, 0)

print(a)     # Print the original
print(a_new) # Print the boolean array

编辑:因此,单行就地操作

a = np.where(a >= np.sort(a)[-10], 1, 0)

EDIT2:答案可以扩展到2D。我制作了一个6x6矩阵,其中我每行标记3个最大值和1。

# 2D example, save top3 per 
a = np.random.rand(6, 6)

a_3 = np.sort(a, axis=1)[:,-3]
a_new = np.where(a >= a_3[:,None], 1, 0)

print(a)
print(a_new)

答案 1 :(得分:2)

这是一种方式。这是一个就地解决方案。有关新数组,请参阅@Chiel's answer

import numpy as np

n = 50

a = np.random.rand(n)
args = np.argsort(a)
a[args[-10:]] = 1
a[args[:-10]] = 0

答案 2 :(得分:0)

使用argpartition查找第39个位置。使用索引进行选择。

from numpy.random import shuffle
a = np.arange(50)
shuffle(a)
b = np.argpartition(a, 39)  
c = a.copy()
c[b[-10:]] = 1  # a[b[-10:]] = 1 in place
c[b[:-10]] = 0  # a[b[:-10]] = 0 in place

演示

a[b[-10:]]
array([42, 40, 48, 46, 43, 41, 44, 49, 47, 45])

使用索引,您可以就地执行此操作,也可以像我一样创建新数组。 (如果您想这样做,只需在a而不是c上进行。

答案 3 :(得分:0)

另一个简单的方法是使用np.argsort()两次,然后将值设置为零或1

a = np.random.rand(6, 6)
rank1=a.argsort()
rank2=rank1.argsort()
a_new[rank2>=3]=1
a_new[rank2<3]=0