首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何使用numpy向量化有条件的掩码加权平均值?

如何使用numpy向量化有条件的掩码加权平均值?
EN

Stack Overflow用户
提问于 2021-01-25 08:52:20
回答 1查看 77关注 0票数 1

未矢量化的代码为:

代码语言:javascript
代码运行次数:0
运行
复制
import numpy as np
import numpy.ma as ma

np.random.seed(42)
H = np.random.uniform(0.1, 1.0, size=(6,8))
r, c = H.shape

mask = H.max(axis=1) > 0.95


x = np.linspace(0, 10, c)
weighted_averages = ma.masked_all((r,), dtype=H.dtype)

for i in range(r):
    if mask[i]:
        weighted_averages[i] = np.average(x, weights=H[i, :])

下面是我对它进行向量化的尝试:

代码语言:javascript
代码运行次数:0
运行
复制
_, xx = np.mgrid[0:10:r*1j, 0:10:c*1j]
not_mask = np.logical_not(mask)


weighted_averages = np.average(xx, weights=H, axis=1)
mwa = ma.masked_array(weighted_averages, mask=not_mask)

它是有效的,在某种意义上,输出是相同的,但我是在“作弊”,因为我首先计算所有的平均值,然后屏蔽“不想要的”值。我怎样才能避免不必要的计算?我猜我必须以某种方式屏蔽xxH或两者。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-25 12:11:58

不如这样吧-

代码语言:javascript
代码运行次数:0
运行
复制
import numpy as np
import numpy.ma as ma

np.random.seed(42)
H = np.random.uniform(0.1, 1.0, size=(6,8))
r, c = H.shape

mask = H.max(axis=1) > 0.95

x = np.linspace(0, 10, c)

H_mask = H[mask]
wa = (np.sum(x * H_mask, axis=1))/np.sum(H_mask, axis=1)
weighted_averages = ma.masked_all((r,), dtype=H.dtype)

weighted_averages[mask] = wa

只需先对数组进行掩码,然后取平均值。我不认为你可以在这里使用np.average,因为它似乎不支持广播。因此,只需手动计算平均值即可。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65877624

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档