本站消息

站长简介/公众号


站长简介:逗比程序员,理工宅男,前每日优鲜python全栈开发工程师,利用周末时间开发出本站,欢迎关注我的微信公众号:幽默盒子,一个专注于搞笑,分享快乐的公众号

  价值13000svip视频教程,python大神匠心打造,零基础python开发工程师视频教程全套,基础+进阶+项目实战,包含课件和源码

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

沿 ndarray 轴具有多个参数的函数的有效映射

发布于2021-06-04 04:27     阅读(338)     评论(0)     点赞(16)     收藏(1)



我有两个ndarrays——一个用于 the values,另一个用于 the weights(源自 上的错误values)。我感兴趣的沿获得的平均值和标准偏差axis=1valuesndarray。为清楚起见,这里有一个完成此任务的玩具结构。

values=[[0.25,0.34,0.28,0.54],[0.23,0.38,0.29,0.55],[0.21,0.36,0.31,0.56]] 
errors=[[0.02,0.01,0.03,0.01],[0.01,0.02,0.03,0.01],[0.04,0.03,0.01,0.02]] 

def invsqerr(x):
    return 1/x**2

weights=np.apply_along_axis(invsqerr, 1, errors)


def wavg_std(y_arr, invsqerr_arr):
    average = np.average(y_arr, weights=invsqerr_arr)
    variance = np.average((y_arr-average)**2, weights=invsqerr_arr)
    return (average, math.sqrt(variance))


for k in range(len(values[0])):
    print (wavg_std([i[k] for i in values], [i[k] for i in weights]))

输出:

(0.23285714285714285, 0.009331389496316869)
(0.34897959183673471, 0.015681120581468193)
(0.30545454545454542, 0.009875254992000192)
(0.54666666666666663, 0.006666666666666672)

在我的情况下len(values[0])(参考 for 循环)是几百万的数量级。for loop对于如此大的数组,似乎不是正确的方法。

可能np.apply_along_axis正在寻求一种基于多个参数的有效方法


解决方案


这是使用 Python 3multiprocessing模块解决此问题的一种有效解决方案

首先,我转置了 ndarraysvaluesweights

values=np.stack(values).transpose()
weights=np.stack(weights).transpose()

然后利用starmap

if __name__ == '__main__':
    with multiprocessing.Pool() as pool:
        results = pool.starmap(wavg_std, zip(values, weights))





所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:https://www.pythonheidong.com/blog/article/983424/8431645bac717132dc31/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

16 0
收藏该文
已收藏

评论内容:(最多支持255个字符)