【问题标题】:Python: Assign NaNs to Matrix Elements Given Statements for Three Other MatricesPython:给定三个其他矩阵的语句,将 NaN 分配给矩阵元素
【发布时间】:2018-12-02 01:00:59
【问题描述】:

我有三个二维矩阵(A、B、D)和一个一维数组(C)。 A 主要包含 NaN 值,但也包含一些非 NaN 值。我想将 NaN 分配给矩阵 D 中满足以下两个语句的所有元素:

(1) 如果 A[i,j] 中的元素为 NaN,则 D[i,j] 应为 NaN。 (2) 如果 B[i,j] 超出 (0.3 - C[j]) 到 (0.7 + C[j]) 的范围,则 D[i,j] 应为 NaN。

我对 python 还很陌生,但我已经尝试编写这段看似简单的代码太久了,我也没有太多运气在谷歌上搜索有关该主题的 python 文档,现在我是时间不多了。所以我在这里试试运气,如果有人有一个有效的解决方案。据我了解python,为了提高效率,人们希望尽可能避免循环,所以如果有人知道一种使用python函数的方法,那将不胜感激。提前致谢!

下面的代码不起作用,但如果上面不清楚的话,至少它可以说明我的野心。

import numpy as np
# Create the fake matrices A, B, C, D
A = np.full((4,5), np.nan)
A[0,0] = 2
A[1,1] = 2
A[2,2] = 2
A[3,3] = 2
A[1,3] = 2
B = np.random.rand(4,5)
C = np.arange(0.0, 0.1, 0.02)
D = np.ones([4,5])

# First loop: meant to fulfill the first statement
for i in np.arange(4):
    for j in np.arange(5):
        D[i,j][np.isnan(A[i,j])] = np.nan

# Second loop: meant to fulfill the second statement
for i in np.arange(4):
    for j in np.arange(5):
        if B[i,j] < (0.3 - C[j]) or B[i,j] > (0.7 + C[j]):
            D[i,j] = np.nan

【问题讨论】:

    标签: python python-3.x numpy nan


    【解决方案1】:

    只需将您提到的条件写成矢量形式即可:

    ind=(np.isnan(A)) + (B<0.3-C)*(B>0.7+C)
    D[ind]=np.nan
    

    【讨论】:

      【解决方案2】:

      对于某些technical reasons 向量化逻辑运算需要使用位运算符。因此,您的条件组合将被写入:

      >>> idx = np.isnan(A) | (B < 0.3 - C) | (B > 0.7 + C) 
      >>> D[idx] = np.nan
      >>> D
      array([[ 1., nan, nan, nan, nan],
             [nan, nan, nan, nan, nan],
             [nan, nan,  1., nan, nan],
             [nan, nan, nan,  1., nan]])
      

      (B 是)

      >>> B
      array([[0.5363705 , 0.20608309, 0.60937827, 0.94685545, 0.80861546],
             [0.1716229 , 0.89674041, 0.39352757, 0.84573667, 0.87769432],
             [0.97621636, 0.81509133, 0.3808146 , 0.84032838, 0.07871174],
             [0.11719543, 0.38021362, 0.76113843, 0.70157337, 0.66438894]])
      

      【讨论】:

      • 感谢您提供优雅的解决方案!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多