Numpy:nanargmin 如果行包含所有 NaN,则选择索引 0

问题描述 投票:0回答:3

给定以下矩阵:

matrix = np.array([[0,np.nan,1],[np.nan,np.nan,np.nan],[1,2,3]])

我想获取最小行值的数组。如果一行包含所有 nan 值,则该行所有 nan 值的索引应为 0。reslting 数组应为。

array([0,0,0])

如果我尝试使用

np.argmin(matrix,axis=1)
那么最小索引就是 np.nan 出现的地方,例如:

array([1, 0, 0])

这是不希望的,如果我使用

np.nanargmin(matrix,axis=1)
我会得到
raise ValueError("All-NaN slice encountered")

python numpy
3个回答
2
投票

使用

numpy.nan_to_num
用无穷大填充 NaN,然后得到
argmin
:

np.argmin(np.nan_to_num(matrix, nan=float('inf')), axis=1)

输出:

array([0, 0, 0])


1
投票

您可以将数组转换为屏蔽数组,其中所有 np.nan 都被屏蔽,然后获取该数组的 argmin:

np.ma.masked_invalid(matrix).argmin(axis=1)

输出:

array([0, 0, 0], dtype=int64)


0
投票

这里是使用

np.inf
的哨兵值(例如
xarray
)填充或填充数据的替代方法。它可能适合任何对
np.nanargmin
docs 中的警告持谨慎态度的人,该警告指出:“如果切片仅包含 NaN 和 Infs,则结果不可信。”

xarray.DataArray.idxmin
方法与
np.nanargmin
类似,但返回最小值的坐标而不是其位置。如果坐标是位置,那么此方法几乎与
np.nanargmin
相同。不同之处在于
xarray.DataArray.idxmin
让您为全 NaN 切片设置
fill_value

import numpy as np
import xarray as xr

matrix = np.array([[0, np.nan, 1],[np.nan, np.nan, np.nan], [1, 2, 3]])
da = xr.DataArray(matrix, coords={"foo": [0, 1, 2], "bar": [0, 1, 2]})

da.idxmin(dim="bar", fill_value=0)
<xarray.DataArray 'bar' (foo: 3)> Size: 24B
array([0, 0, 0])
Coordinates:
  * foo      (foo) int64 24B 0 1 2
© www.soinside.com 2019 - 2024. All rights reserved.