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