猿问

Python:在给定其他三个矩阵的语句的情况下,将NaN分配给矩阵元素

我有三个2D矩阵(A,B,D)和一个1D数组(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还是一个新手,但我已经尝试了很长时间来撰写这段看似简单的代码,而且我也没有太多关于该主题的google 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


慕运维8079593
浏览 161回答 2
2回答

芜湖不芜

由于某些技术原因,矢量化逻辑运算要求使用按位运算符。因此,您的条件组合将写为:>>> idx = np.isnan(A) | (B < 0.3 - C) | (B > 0.7 + C)&nbsp;>>> D[idx] = np.nan>>> Darray([[ 1., nan, nan, nan, nan],&nbsp; &nbsp; &nbsp; &nbsp;[nan, nan, nan, nan, nan],&nbsp; &nbsp; &nbsp; &nbsp;[nan, nan,&nbsp; 1., nan, nan],&nbsp; &nbsp; &nbsp; &nbsp;[nan, nan, nan,&nbsp; 1., nan]])(B是)>>> Barray([[0.5363705 , 0.20608309, 0.60937827, 0.94685545, 0.80861546],&nbsp; &nbsp; &nbsp; &nbsp;[0.1716229 , 0.89674041, 0.39352757, 0.84573667, 0.87769432],&nbsp; &nbsp; &nbsp; &nbsp;[0.97621636, 0.81509133, 0.3808146 , 0.84032838, 0.07871174],&nbsp; &nbsp; &nbsp; &nbsp;[0.11719543, 0.38021362, 0.76113843, 0.70157337, 0.66438894]])

MYYA

仅以矢量形式编写您提到的条件将是:ind=(np.isnan(A)) + (B<0.3-C)*(B>0.7+C)D[ind]=np.nan
随时随地看视频慕课网APP

相关分类

Python
我要回答