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

92vpleto  于 2022-12-13  发布在  其他
关注(0)|答案(4)|浏览(190)

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

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

在一个类似的线程中建议使用nonzero()或where(),但是当我尝试按照建议的方式使用时,它创建了一个新的数组,该数组的索引与原始数组的索引不同:

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

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

yduiuuwa

yduiuuwa1#

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]给出该索引处的相应值。

dauxcl2d

dauxcl2d2#

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

vs91vp4v3#

我认为你@艾米丽非常接近正确答案。你说:
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]

对于原始数组任意维数。

kupeojn6

kupeojn64#

ndim溶液

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

解释
1.屏蔽掉零会创建t0。还有其他方法,请参见性能图。
1.查找最小位置,返回展平(1D)索引。

  1. 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])                #

掩码:i = np.unravel_index(np.ma.masked_where(a==0, a).argmin(), a.shape)
名称: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)

相关问题