我有一个形状为(100,100,20(的numpy数组(在python 3中(
我想为每个"像素"找到具有最小值的15个通道,并使它们为零(意思是:使阵列稀疏,只保留5个最高值(。
示例:
输入:array=[[1,2,3],[7,6,9],[12,71,3]],num_channels_to_zero=2
输出:[[0,0,3],[0,0,9],[0,71,0]
我该怎么做?
我现在有什么:
array = numpy.random.rand(100, 100, 20)
inds = numpy.argsort(array, axis=-1) # also shape (100, 100, 20)
我想做一些类似的事情
array[..., inds[..., :15]] = 0
但它并没有给我想要的
np.argsort
输出适合numpy的[...]_along_axis
函数的索引。这包括np.put_along_axis
:
import numpy as np
array = np.random.rand(100, 100, 20)
print(array[0,0])
#[0.44116124 0.94656705 0.20833932 0.29239585 0.33001399 0.82396784
# 0.35841905 0.20670957 0.41473762 0.01568006 0.1435386 0.75231818
# 0.5532527 0.69366173 0.17247832 0.28939985 0.95098187 0.63648877
# 0.90629116 0.35841627]
inds = np.argsort(array, axis=-1)
np.put_along_axis(array, inds[..., :15], 0, axis=-1)
print(array[0,0])
#[0. 0.94656705 0. 0. 0. 0.82396784
# 0. 0. 0. 0. 0. 0.75231818
# 0. 0. 0. 0. 0.95098187 0.
# 0.90629116 0. ]
如numpy文档中所述
从每一行中,都应该选择一个特定的元素。行索引仅为[0,1,2],列索引指定要为相应行选择的元素,此处为[0、1,0]。将两者结合使用,可以使用高级索引解决任务:
>>>x = np.array([[1, 2], [3, 4], [5, 6]]) >>>x[[0, 1, 2], [0, 1, 0]] array([1, 4, 5])
因此,对于您的示例:
a = np.array([[1,2,3], [7,6,9], [12,71,3]])
amax = a.argmax(axis=-1)
a[np.arange(a.shape[0]), amax] = 0
a
array([[ 1, 2, 0],
[ 7, 6, 0],
[12, 0, 3]])