Python 多维平均numpy屏蔽阵列
可以在多个维度上计算numpy数组的平均值,例如Python 多维平均numpy屏蔽阵列,python,numpy,masked-array,Python,Numpy,Masked Array,可以在多个维度上计算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
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
>>将numpy作为np导入
>>>a=np.random.randint(0,10,(2,2,2))
>>>a
数组([[0,9],
[2, 5]],
[[8, 6],
[0, 7]]])
>>>a.平均值(轴=(1,2))
数组([4,5.25])
>>>ma=np.ma.array(a,掩码=(a<5))
>>>平均值(轴=(1,2))
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/usr/lib/python2.7/site packages/numpy/ma/core.py”,第5066行,平均值
cnt=自身计数(轴=轴)
文件“/usr/lib/python2.7/site packages/numpy/ma/core.py”,第4280行,计数
n1=np.尺寸(m,轴)
文件“/usr/lib/python2.7/site packages/numpy/core/fromneric.py”,第2700行,大小
返回a.shape[轴]
TypeError:元组索引必须是整数,而不是元组
如何计算屏蔽阵列在多轴上的平均值,最好与普通阵列一样简单
(我宁愿使用一种不意味着定义新函数的解决方案,如中所述。)您可以在平均值之前对其进行重塑:
>>>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。可以在平均值之前对其进行重塑:
>>>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
的包装。但只要它起作用,我就不会抱怨 我发现尽管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
的包装。但只要它起作用,我就不会抱怨 你试过ma.mean(2)。mean(1)
?@wflynny:这个答案应该有用。在这种情况下,他只想计算“未屏蔽值”的平均值。有关未实现元组索引的更多详细信息,请参见。@wflynny:这是我的第一个猜测,但它改变了每个值的权重。在前面的示例中,它返回[7,7.25]
,而不是它应该返回的[7,7]
。(另外,应该是ma.mean(1).mean(1)
)你试过ma.mean(2).mean(1)
?@wflynny:这个答案应该行得通。在这种情况下,他只想计算“未屏蔽值”的平均值。有关未实现元组索引的更多详细信息,请参见。@wflynny:这是我的第一个猜测,但它改变了每个值的权重。在前面的示例中,它返回[7,7.25]
,而不是它应该返回的[7,7]
。(另外,它将是ma.平均值(1).平均值(1)
)