Python 带numpy的条件平均
给定一个2x3数组,我想计算轴=0的平均值,但只考虑大于0的值 所以考虑到数组Python 带numpy的条件平均,python,arrays,numpy,average,Python,Arrays,Numpy,Average,给定一个2x3数组,我想计算轴=0的平均值,但只考虑大于0的值 所以考虑到数组 [ [1,0], [0,0], [1,0] ] 我希望输出是 # 1, 0, 1 filtered for > 0 gives 1, 1, average = (1+1)/2 = 1 # 0, 0, 0 filtered for > 0 gives 0, 0, 0, average = 0 [1 0] 我现在的代码是 import numpy as np frame = np.arr
[ [1,0],
[0,0],
[1,0] ]
我希望输出是
# 1, 0, 1 filtered for > 0 gives 1, 1, average = (1+1)/2 = 1
# 0, 0, 0 filtered for > 0 gives 0, 0, 0, average = 0
[1 0]
我现在的代码是
import numpy as np
frame = np.array([ [1,0],
[0,0],
[1,0] ])
weights=np.array(frame)>0
print("weights:")
print(weights)
print("average without weights:")
print((np.average(frame, axis=0)))
print("average with weights:")
print((np.average(frame, axis=0, weights=weights)))
这给了我
weights:
[[ True False]
[False False]
[ True False]]
average without weights:
[ 0.66666667 0. ]
average with weights:
Traceback (most recent call last):
File "C:\Users\myuser\project\test.py", line 123, in <module>
print((np.average(frame, axis=0, weights=weights)))
File "C:\Users\myuser\Miniconda3\envs\myenv\lib\site-packages\numpy\lib\function_base.py", line 1140, in average
"Weights sum to zero, can't be normalized")
ZeroDivisionError: Weights sum to zero, can't be normalized
权重:
[[真假]
[假]
[对错]]
不含权重的平均值:
[ 0.66666667 0. ]
加权平均值:
回溯(最近一次呼叫最后一次):
文件“C:\Users\myuser\project\test.py”,第123行,在
打印((np.平均值(帧,轴=0,权重=权重)))
文件“C:\Users\myuser\Miniconda3\envs\myenv\lib\site packages\numpy\lib\function\u base.py”,平均第1140行
“权重和为零,无法标准化”)
ZeroDivisionError:权重和为零,无法正常化
我不理解这个错误。我做错了什么?如何获得沿
轴=0大于零的所有值的平均值?谢谢 您可以获得大于零的掩码,并使用它沿第一个轴执行元素级多重应用和求和缩减。最后,除以沿第一个轴的遮罩元素数,得到平均值
因此,一种解决办法是-
mask = a > 0 # Input array : a
out = np.einsum('i...,i...->...',a,mask)/mask.sum(0)
样本运行-
In [52]: a
Out[52]:
array([[ 3, -3, 3],
[ 2, 2, 0],
[ 0, -3, 1],
[ 0, 1, 1]])
In [53]: mask = a > 0
In [56]: np.einsum('i...,i...->...',a,mask) # summations of > 0s
Out[56]: array([5, 3, 5])
In [57]: np.einsum('i...,i...->...',a,mask)/mask.sum(0) # avg values of >0s
Out[57]: array([ 2.5 , 1.5 , 1.66666667])
为了解释所有零列,我们似乎期望结果是0
。因此,我们可以使用np.where
进行选择,如下所示-
In [61]: a[:,-1] = 0
In [62]: a
Out[62]:
array([[ 3, -3, 0],
[ 2, 2, 0],
[ 0, -3, 0],
[ 0, 1, 0]])
In [63]: mask = a > 0
In [65]: np.where( mask.any(0), np.einsum('i...,i...->...',a,mask)/mask.sum(0), 0)
__main__:1: RuntimeWarning: invalid value encountered in true_divide
Out[65]: array([ 2.5, 1.5, 0. ])
不要理会那里的警告
如果您对警告感到偏执,请使用masking
-
mask = a > 0
vm = mask.any(0) # valid mask
out = np.zeros(a.shape[1])
out[vm] = np.einsum('ij,ij->j',a[:,vm],mask[:,vm])/mask.sum(0)[vm]
0,0,0为>0过滤得到0,0,0
。。。不,没有。你能更准确地描述一下你想如何处理没有发现积极因素的情况吗?结果是否应始终为0?结果应该是所有元素的平均值吗?是否应插补其他值?加权平均值是指平均数与权重乘积之和除以权重之和。由于第二列的权重加起来等于0(三者均为False
),因此无法进行除法。对发布的解决方案的反馈?当然,在无正元素的情况下,您仍然被零除法,因此如果发生这种情况,您将得到NaN平均值。试图取无数字平均值的潜在概念问题仍然存在。