繁体   English   中英

将零分配给 numpy 3d 数组中的最小值

[英]Assign zeros to minimum values in numpy 3d array

我有一个形状为 (100, 100, 20) 的 numpy 数组(在 python 3 中)

我想为每个“像素”找到具有最小值的 15 个通道,并将它们设为零(意思是:使数组稀疏,只保留 5 个最大值)。

例子:

输入:数组 = [[1,2,3],[7,6,9],[12,71,3]],num_channles_to_zero = 2

output:[[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]])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM