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

时间:2017-07-10 02:07:02

标签: python arrays numpy

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

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

在类似的线程中建议使用nonzero()或where(),但是当我尝试以建议的方式使用它时,它会创建一个不具有相同索引的新数组。原文:

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

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

4 个答案:

答案 0 :(得分:8)

<style name="AppTheme" parent="Base.Theme.AppCompat.Light.DarkActionBar"> </style> 返回非零值的索引。在你的情况下,它返回,

np.nonzero(theta)

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

[1,2,3]

当您对上一个输出执行[1,2,3]时,它将返回值np.argmin(theta[np.nonzero(theta)])的索引,该值为0。

因此,正确的方法是:

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

i,jtheta[i,j]会在该索引处给出相应的值。

答案 1 :(得分:2)

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

  

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

最后一句是正确的=&gt;第一个是错误的,因为它应该在新数组中给出索引。

现在让我们在旧(原始)数组中提取正确的索引:

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]

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

答案 2 :(得分:2)

#!/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

答案 3 :(得分: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)