Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:为其他三个矩阵的给定语句的矩阵元素分配NAN_Python_Python 3.x_Numpy_Nan - Fatal编程技术网

Python:为其他三个矩阵的给定语句的矩阵元素分配NAN

Python:为其他三个矩阵的给定语句的矩阵元素分配NAN,python,python-3.x,numpy,nan,Python,Python 3.x,Numpy,Nan,我有三个二维矩阵(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还相当陌生,但我已经尝试编写这段看似简单的代码太长时间了,而且我也没有太多机会在google上搜索python文档,现在我的时间不多了。所以,如果有人有一个有

我有三个二维矩阵(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还相当陌生,但我已经尝试编写这段看似简单的代码太长时间了,而且我也没有太多机会在google上搜索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
将numpy导入为np
#创建假矩阵A、B、C、D
A=np.完全((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.rand.rand(4,5)
C=np.arange(0.0,0.1,0.02)
D=np.one([4,5])
#第一个循环:用于完成第一条语句
对于np.arange(4)中的i:
对于np.arange(5)中的j:
D[i,j][np.isnan(A[i,j])]=np.nan
#第二个循环:用于完成第二个语句
对于np.arange(4)中的i:
对于np.arange(5)中的j:
如果B[i,j]<(0.3-C[j])或B[i,j]>(0.7+C[j]):
D[i,j]=np.nan

仅以矢量形式编写您提到的条件将是:

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

仅以矢量形式编写您提到的条件将是:

ind=(np.isnan(A)) + (B<0.3-C)*(B>0.7+C)
D[ind]=np.nan
ind=(np.isnan(A))+(B0.7+C)
D[ind]=np.nan
对于某些矢量化逻辑操作,需要使用位运算符。因此,您的条件组合将被写入:

>>> 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]])
对于某些矢量化逻辑操作,需要使用位运算符。因此,您的条件组合将被写入:

>>> 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]])

感谢您提供的优雅解决方案!感谢您提供的优雅解决方案!