我想在float64
数组中找到最大值,不包括nan
值。
我看到np.nanmax
函数,但它没有给出与找到的值对应的索引。
是否有办法直接恢复索引?
答案 0 :(得分:16)
Numpy有一个argmax
函数可以返回,尽管你必须手动处理nan
。 nan
总是被排序到数组的末尾,因此请记住:
a = np.random.rand(10000)
a[np.random.randint(10000, size=(10,))] = np.nan
a = a.reshape(100, 100)
def nanargmax(a):
idx = np.argmax(a, axis=None)
multi_idx = np.unravel_index(idx, a.shape)
if np.isnan(a[multi_idx]):
nan_count = np.sum(np.isnan(a))
# In numpy < 1.8 use idx = np.argsort(a, axis=None)[-nan_count-1]
idx = np.argpartition(a, -nan_count-1, axis=None)[-nan_count-1]
multi_idx = np.unravel_index(idx, a.shape)
return multi_idx
>>> nanargmax(a)
(20, 93)
答案 1 :(得分:6)
您应该使用np.where
In [17]: a=np.random.uniform(0, 10, size=10)
In [18]: a
Out[18]:
array([ 1.43249468, 4.93950873, 7.22094395, 1.20248629, 4.66783985,
6.17578054, 4.6542771 , 7.09244492, 7.58580515, 5.72501954])
In [20]: np.where(a==a.max())
Out[20]: (array([8]),)
这也适用于2个数组,返回值是索引。 这里我们创建一个从1到9的范围:
x = np.arange(9.).reshape(3, 3)
这将返回等于5的项目的索引:
In [34]: np.where(x == 5)
Out[34]: (array([1]), array([2])) # the first one is the row index, the second is the column
您可以直接使用此值来切割数组:
In [35]: x[np.where(x == 5)]
Out[35]: array([ 5.])
答案 2 :(得分:3)
您想使用numpy.nanargmax
文档提供了一些明确的示例。
a = np.array([[np.nan, 4], [2, 3]])
print np.argmax(a)
0
print np.nanargmax(a)
1
np.nanargmax(a, axis=0)
array([1, 0])
np.nanargmax(a, axis=1)
array([1, 1])