将 nan 值转换为零
我有一个 2D numpy 数组。该数组中的某些值是 NaN
。我想使用这个数组执行某些操作。例如,考虑一下数组:
[[ 0. 43. 67. 0. 38.]
[ 100. 86. 96. 100. 94.]
[ 76. 79. 83. 89. 56.]
[ 88. NaN 67. 89. 81.]
[ 94. 79. 67. 89. 69.]
[ 88. 79. 58. 72. 63.]
[ 76. 79. 71. 67. 56.]
[ 71. 71. NaN 56. 100.]]
我尝试一次获取每一行,以相反的顺序对其进行排序,以从该行中获取最多 3 个值并取它们的平均值。我尝试的代码是:
# nparr is a 2D numpy array
for entry in nparr:
sortedentry = sorted(entry, reverse=True)
highest_3_values = sortedentry[:3]
avg_highest_3 = float(sum(highest_3_values)) / 3
这不适用于包含 NaN
的行。我的问题是,是否有一种快速方法可以将 2D numpy 数组中的所有 NaN
值转换为零,以便我在排序和尝试做的其他事情上没有问题。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
其中
A
是二维数组:函数
isnan
生成一个 bool 数组,指示NaN
值的位置。布尔数组可以用来索引相同形状的数组。把它想象成一个面具。Where
A
is your 2D array:The function
isnan
produces a bool array indicating where theNaN
values are. A boolean array can by used to index an array of the same shape. Think of it like a mask.这应该有效:
在上面的情况下,其中_are_NaNs 是:
关于效率的补充。下面的示例使用 numpy 1.21.2 运行,
因此
a[np.isnan(a)] = 0
速度更快。This should work:
In the above case where_are_NaNs is:
A complement about efficiency. The examples below were run with numpy 1.21.2
In consequence
a[np.isnan(a)] = 0
is faster.nan_to_num() 怎么样?
How about nan_to_num()?
您可以使用
np.where
查找NaN
的位置:You could use
np.where
to find where you haveNaN
:drake的答案使用
nan_to_num
:A code example for drake's answer to use
nan_to_num
:您可以使用 numpy.nan_to_num :
示例(参见文档):
You can use numpy.nan_to_num :
Example (see doc) :
nan 永远不等于 nan
所以对于二维数组
nan is never equal to nan
so for a 2D array
您可以使用 lambda 函数,这是一维数组的示例:
这将为您提供结果:
You can use lambda function, an example for 1D array:
This will give you the result:
出于您的目的,如果所有项目都存储为
str
并且您只需使用您正在使用的排序,然后检查第一个元素并将其替换为“0”For your purposes, if all the items are stored as
str
and you just use sorted as you are using and then check for the first element and replace it with '0'