如何在 Python 中使用带有“None”值的 numpy?
Posted
技术标签:
【中文标题】如何在 Python 中使用带有“None”值的 numpy?【英文标题】:How to use numpy with 'None' value in Python? 【发布时间】:2010-11-01 00:45:57 【问题描述】:我想以这种形式计算 Python 中数组的平均值:
Matrice = [1, 2, None]
我只想让numpy.mean
计算忽略我的None
值,但我不知道该怎么做。
【问题讨论】:
+1:这个问题可能与从数据库导入的数组特别相关,其中值有时可能为 NULL。 【参考方案1】:您正在寻找masked arrays。这是一个例子。
import numpy.ma as ma
a = ma.array([1, 2, None], mask = [0, 0, 1])
print "average =", ma.average(a)
从上面链接的 numpy 文档中,“numpy.ma 模块为支持带掩码的数据数组的 numpy 提供了几乎类似工作的替代品。”
【讨论】:
一个很有帮助的成员函数是filled
。将掩码数组恢复为正常数组,填充一个我认为无效的值(NaN,-9999,无论您的用户需要什么)。
掩码数组的性能也明显低于常规 numpy 数组,因为实现是纯 Python。如果您正在处理大数据,请注意性能影响。
使用 numpy.nanmean 比在 numpy 之外寻找临时解决方案更好;请参阅下面的答案。
掩码数组不是临时的,也不是在 numpy 之外。我的答案中的文档链接显示了这一点。【参考方案2】:
没有使用过 numpy,但在标准 python 中,您可以使用列表推导过滤掉 None
或过滤功能
>>> [i for i in [1, 2, None] if i != None]
[1, 2]
>>> filter(lambda x: x != None, [1, 2, None])
[1, 2]
然后平均结果以忽略None
【讨论】:
x != None
通常写成 x is not None
(PEP 8:“与 None 之类的单例的比较应始终使用 'is' 或 'is not' 来完成,而不是相等运算符。”)跨度>
【参考方案3】:
你可以使用 scipy:
import scipy.stats.stats as st
m=st.nanmean(vec)
【讨论】:
谢谢,这正是我所需要的! 这不起作用。a = [1,2,None]
然后 st.nanmean(a)
导致 TypeError。
是的,你是对的,它适用于 numpy.nan,而不适用于 None。在计算 numpy 向量的平均值时最有用。
现在你也可以使用 numpy.nanmean【参考方案4】:
您还可以使用 NaN 或 Inf 之类的值。
In [1]: array([1, 2, None])
Out[1]: array([1, 2, None], dtype=object)
In [2]: array([1, 2, NaN])
Out[2]: array([ 1., 2., NaN])
实际上,它甚至可能不是一个杂物。 Wikipedia says:
NaN 可用于表示计算中的缺失值。
实际上,这对 mean() 函数不起作用,所以没关系。 :)
In [20]: mean([1, 2, NaN])
Out[20]: nan
【讨论】:
实际上,mean(a[~isnan(a)])
明确选择所有非 NaN 值是可行的。【参考方案5】:
你也可以使用过滤器,传递None给它,它会过滤非True对象,也是0,:D 所以,当你也不需要 0 的时候使用它。
>>> filter(None,[1, 2, None])
[1, 2]
【讨论】:
【参考方案6】:您可以将数组“向上转换”为 numpy 的 float64 dtype,然后使用 numpy 的 nanmean 方法,如下例所示:
import numpy as np
arr = [1,2,3, None]
arr2 = np.array(arr, dtype=np.float64)
print(arr2) # [ 1. 2. 3. nan]
print(np.nanmean(arr2)) # 2.0
【讨论】:
【参考方案7】:np.mean(矩阵[矩阵!=无])
【讨论】:
以上是关于如何在 Python 中使用带有“None”值的 numpy?的主要内容,如果未能解决你的问题,请参考以下文章
在 python 中使用 panda 库和 Dash Plotly 创建带有标签和值的下拉菜单
如何使用带有编解码器值的 python .replace 来删除特殊字符?