如何使用numpy查找最小非零元素的索引?

10

我有一个4x1的数组,想要查找最小的非零值并找到其索引。例如:

theta = array([0,1,2,3]).reshape(4,1)

在一个类似的线程中提到可以使用nonzero()或where()方法,但当我试图按照建议使用它们时,却创建了一个没有与原始数组相同索引的新数组:

np.argmin(theta[np.nonzero(theta)])

返回的索引是零,这显然是不对的。我认为这是因为它首先创建了一个非零元素的新数组。如果有重复的最小值,我只对第一个最小值感兴趣。


1
那个其他的线程在哪里? - Stefan Pochmann
4个回答

15

np.nonzero(theta) 返回非零值的索引,对于你的情况,它返回

[1,2,3]

然后,theta[np.nonzero(theta)] 返回值为

[1,2,3]

当你在前面的输出上执行 np.argmin(theta[np.nonzero(theta)]) ,它会返回值为1的索引0

因此,正确的方法是:

i,j = np.where( theta==np.min(theta[np.nonzero(theta)])) 其中 i,j 是原始Numpy数组中最小的非零元素的索引。

theta[i,j]theta[i] 给出相应索引处的值。


1
我不理解这里的i和j是在做什么。 - Emily
theta.shape 返回 (4,1) 是因为你进行了重塑。因此,需要两个索引。 - Sriram Sitharaman
1
“i”和“j”作为数组看起来相当丑陋,特别是因为Emily说她只对第一个最小值感兴趣,如果有重复的话。你的代码会导致所有出现的索引数组。 - Stefan Pochmann
问题要求获取最小非零值的索引。然而,我已经更新了我的答案,告诉你如何获取该值。 - Sriram Sitharaman
如果我在一个更大的数组上尝试这个答案,比如一个图像数组,那么它会返回一个索引数组,而不仅仅是找到最小值的单个索引。有没有解决办法? - Ambika Saxena

6
#!/usr/bin/env python

# Solution utilizing numpy masking of zero value in array

import numpy as np
import numpy.ma as ma
a = [0,1,2,3]
a = np.array(a)

print "your array: ",a

# the non-zero minimum value
minval = np.min(ma.masked_where(a==0, a)) 
print "non-zero minimum: ",minval

# the position/index of non-zero  minimum value in the array
minvalpos = np.argmin(ma.masked_where(a==0, a))  
print "index of non-zero minimum: ", minvalpos

2
我认为你@Emily非常接近正确的答案。你说:

np.argmin(theta[np.nonzero(theta)])给出了索引零,这显然是不对的。我认为这是因为它首先创建了一个非零元素的新数组。

最后一句话是正确的=>第一句话是错误的,因为它应该在新数组中给出索引。
现在让我们提取旧(原始)数组中的正确索引:
nztheta_ind = np.nonzero(theta)
k = np.argmin(theta[nztheta_ind])
i = nztheta_ind[0][k]
j = nztheta_ind[1][k]

或者:

[i[k] for i in nztheta_ind]

适用于原始数组的任意维度。


0

ndim解决方案

i = np.unravel_index(np.where(theta!=0, theta, theta.max()+1).argmin(), theta.shape)

说明

  1. 将零掩盖创建t0。还有其他方法,请参见perfplot。
  2. 查找最小位置,返回平坦(1D)索引。
  3. unravel_index解决了这个问题,并且尚未被建议。
theta = np.triu(np.random.rand(4,4), 1)  # example array

t0 = np.where(theta!=0, theta, np.nan)   # 1
i0 = np.nanargmin(t0)                    # 2
i = np.unravel_index(i0, theta.shape)    # 3

print(theta, i, theta[i])                #

perfplot
掩码: i = np.unravel_index(np.ma.masked_where(a==0, a).argmin(), a.shape)
NaN: i = np.unravel_index(np.nanargmin(np.where(a!=0, a, np.nan)), a.shape)
最大值: i = np.unravel_index(np.where(a!=0, a, a.max()+1).argmin(), a.shape)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接