在多个维度上平均 numpy 掩码数组
Averaging numpy masked array over multiple dimensions
可以计算多个维度上的 numpy 数组的平均值,例如。 my_ndarray.mean(axis=(1,2))
。
但是,它似乎不适用于 掩码数组:
>>> import numpy as np
>>> a = np.random.randint(0, 10, (2, 2, 2))
>>> a
array([[[0, 9],
[2, 5]],
[[8, 6],
[0, 7]]])
>>> a.mean(axis=(1, 2))
array([ 4. , 5.25])
>>> ma = np.ma.array(a, mask=(a < 5))
>>> ma.mean(axis=(1, 2))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/site-packages/numpy/ma/core.py", line 5066, in mean
cnt = self.count(axis=axis)
File "/usr/lib/python2.7/site-packages/numpy/ma/core.py", line 4280, in count
n1 = np.size(m, axis)
File "/usr/lib/python2.7/site-packages/numpy/core/fromnumeric.py", line 2700, in size
return a.shape[axis]
TypeError: tuple indices must be integers, not tuple
如何计算多个轴上的掩码数组的平均值,最好像普通数组一样简单?
(我宁愿使用不意味着定义新函数的解决方案,如 中所提议的那样。)
你可以在均值之前重塑它:
>>>ma.reshape(mc.shape[0],-1).mean(1)
masked_array(data = [1.6666666666666667 4.0],
mask = [False False],
fill_value = 1e+20)
请注意,部分应用平均会导致结果不明确:
>>> ma.mean(1).mean(1)
masked_array(data = [1.5 4.0],
mask = [False False],
fill_value = 1e+20)
>>> ma.mean(2).mean(1)
masked_array(data = [2.25 4.0],
mask = [False False],
fill_value = 1e+20)
解释者:
>>>ma
masked_array(data =
[[[0 1]
[4 --]]
[[-- --]
[-- 4]]],
mask =
[[[False False]
[False True]]
[[ True True]
[ True False]]],
fill_value = 999999)
每种情况下的权重都不相同。
要在其他维度取平均值,可以在之前使用np.rollaxis。
我发现虽然 np.ma.mean
不起作用,但 np.ma.average
给出了预期的结果:
>>> np.ma.average(ma, axis=(1,2))
masked_array(data = [7.0 7.0],
mask = [False False],
fill_value = 1e+20)
这令人困惑,因为对于常规数组,np.average
只是 np.mean
的包装器。但只要有用,我就不会抱怨!
可以计算多个维度上的 numpy 数组的平均值,例如。 my_ndarray.mean(axis=(1,2))
。
但是,它似乎不适用于 掩码数组:
>>> import numpy as np
>>> a = np.random.randint(0, 10, (2, 2, 2))
>>> a
array([[[0, 9],
[2, 5]],
[[8, 6],
[0, 7]]])
>>> a.mean(axis=(1, 2))
array([ 4. , 5.25])
>>> ma = np.ma.array(a, mask=(a < 5))
>>> ma.mean(axis=(1, 2))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/site-packages/numpy/ma/core.py", line 5066, in mean
cnt = self.count(axis=axis)
File "/usr/lib/python2.7/site-packages/numpy/ma/core.py", line 4280, in count
n1 = np.size(m, axis)
File "/usr/lib/python2.7/site-packages/numpy/core/fromnumeric.py", line 2700, in size
return a.shape[axis]
TypeError: tuple indices must be integers, not tuple
如何计算多个轴上的掩码数组的平均值,最好像普通数组一样简单?
(我宁愿使用不意味着定义新函数的解决方案,如
你可以在均值之前重塑它:
>>>ma.reshape(mc.shape[0],-1).mean(1)
masked_array(data = [1.6666666666666667 4.0],
mask = [False False],
fill_value = 1e+20)
请注意,部分应用平均会导致结果不明确:
>>> ma.mean(1).mean(1)
masked_array(data = [1.5 4.0],
mask = [False False],
fill_value = 1e+20)
>>> ma.mean(2).mean(1)
masked_array(data = [2.25 4.0],
mask = [False False],
fill_value = 1e+20)
解释者:
>>>ma
masked_array(data =
[[[0 1]
[4 --]]
[[-- --]
[-- 4]]],
mask =
[[[False False]
[False True]]
[[ True True]
[ True False]]],
fill_value = 999999)
每种情况下的权重都不相同。
要在其他维度取平均值,可以在之前使用np.rollaxis。
我发现虽然 np.ma.mean
不起作用,但 np.ma.average
给出了预期的结果:
>>> np.ma.average(ma, axis=(1,2))
masked_array(data = [7.0 7.0],
mask = [False False],
fill_value = 1e+20)
这令人困惑,因为对于常规数组,np.average
只是 np.mean
的包装器。但只要有用,我就不会抱怨!