【问题标题】:Change matrix elements in one matrix, given statements in two other matrices, in python在一个矩阵中更改矩阵元素,给定另外两个矩阵中的语句,在python中
【发布时间】:2018-02-26 10:40:28
【问题描述】:

我有两个一维矩阵 A 和 B,在一些随机位置包含 NaN 值。我想明智地添加这些矩阵元素(C[i] = A[i] + B[i]) 并取元素总和的平均值。这在下面的代码中运行良好且高效:

import numpy as np
# Create some fake matrices
A = np.arange(0,10,0.5)
B = 10.0*np.arange(0,10,0.5)

# Replace some random elements in A and B with NaN 
A[15] = np.nan
A[16] = np.nan
A[17] = np.nan
A[18] = np.nan
B[1] = np.nan
B[2] = np.nan
B[17] = np.nan
B[18] = np.nan

# Sum over A and B, element wise, and take the mean of the sums
C = 0.5 * ( np.where(np.isnan(A), B, A + np.nan_to_num(B)) )

但是,如果 A[i]B[i] 之一包含 NaN 而另一个不包含,我不想取总和的平均值,而是将矩阵的值保留为不是NaN 的值。这个我一直没能解决。

换句话说(给定 A 和 B)我最终希望 C 成为:

A
array([ 0., 0.5, 1., 1.5, 2., 2.5, 3., 3.5, 4., 4.5, 
        5., 5.5, 6., 6.5, 7., nan, nan, nan, nan, 9.5])
B
array([ 0., nan, nan, 15., 20., 25., 30., 35., 40., 45.,
        50., 55., 60., 65., 70., 75., 80., nan, nan, 95.])
# What I eventually want C to be:
C
array([  0., 0.5, 1. , 8.25, 11., 13.75, 16.5, 19.25, 22., 24.75, 
         27.5, 30.25, 33., 35.75, 38.5, 75., 80., nan, nan, 52.25])

有没有人有任何(有效的)建议我可以如何做到这一点? (例如,我想尽可能避免耗时的循环)。

【问题讨论】:

    标签: python-2.7 numpy


    【解决方案1】:

    NumPy 的 nanmean 会在两个数字都是 np.nan 时生成警告,但它会给出您想要的结果:

    C = np.nanmean([A, B], axis=0)
    

    【讨论】:

    • 谢谢!优雅的解决方案!
    • @kirerik 不用担心,如果它解决了您的问题,请随时点赞或接受!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    • 2015-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多