我有一个4x1数组,我想搜索最小非零值并找到它的索引。例如:
theta = array([0,1,2,3]).reshape(4,1)
在类似的线程中建议使用nonzero()或where(),但是当我尝试以建议的方式使用它时,它会创建一个不具有相同索引的新数组。原文:
np.argmin(theta[np.nonzero(theta)])
指数为零,显然不对。我认为这是因为它首先创建了一个非零元素的新数组。如果有重复项,我只对第一个最小值感兴趣。
答案 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,j
或theta[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)
i = np.unravel_index(np.where(theta!=0, theta, theta.max()+1).argmin(), theta.shape)
t0
。还有其他方法,请参见perfplot。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)
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)