用numpy矩阵进行除法,可能导致nan

2024-03-29 15:31:12 发布

您现在位置:Python中文网/ 问答频道 /正文

在python中,如何划分两个numpy矩阵A和{},而这两个矩阵有时在同一个单元格上有0?在

基本上A[i,j]>=B[i,j]对于所有ij。我需要计算C=A/B。但有时{}。当发生这种情况时,我需要将A[i,j]/B[i,j]定义为0。在

除了浏览所有索引之外,还有没有一种简单的python方法?在


Tags: 方法numpy定义情况矩阵
2条回答

您可以对ufunc使用^{}参数,例如^{}

np.true_divide(A, B, where=(A!=0) | (B!=0))

如果没有负值(如注释中所述)和每个元素的A >= B(如问题中所述),可以将其简化为:

^{2}$

因为A[i, j] == 0意味着{}。在


例如:

import numpy as np
A = np.random.randint(0, 3, (4, 4))
B = np.random.randint(0, 3, (4, 4))
print(A)
print(B)
print(np.true_divide(A, B, where=(A!=0) | (B!=0)))

[[1 0 2 1]
 [1 0 0 0]
 [2 1 0 0]
 [2 2 0 2]]

[[1 0 1 1]
 [2 2 1 2]
 [2 1 0 1]
 [2 0 1 2]]

[[ 1.   0.   2.   1. ]
 [ 0.5  0.   0.   0. ]
 [ 1.   1.   0.   0. ]
 [ 1.   inf  0.   1. ]]

另一种方法:只需在除法后替换nans:

C = A / B          # may print warnings, suppress them with np.seterrstate if you want
C[np.isnan(C)] = 0

您可以使用带^{}的掩码在这样的A and B being both zeros或其他情况中进行选择,然后分别将0或元素除法-

from __future__ import division # For Python 2.x

mask = (A == B) & (A==0)
C = np.where(mask, 0, A/B)

关于掩码的创建:(A==B)将是A和{}之间相等的所有元素的掩码,使用(A==0)我们有一个包含{}中所有元素的掩码。因此,使用(A == B) & (A==0)的组合掩码,我们就得到了A和{}都是零的地方的掩码。一个更简单、更容易理解的版本是检查A和{}中的0,它将是:

^{2}$

关于np.where的用法,其语法是:

C = np.where(mask, array1, array2)

也就是说,我们将根据掩码选择分配到C中的元素。如果对应的掩码元素是True,那么我们从array1中选取相应的元素,否则从{}中选取相应的元素。这是在元素级别完成的,因此,我们得到了输出C。在

样本运行-

In [48]: A
Out[48]: 
array([[4, 1, 4, 0, 3],
       [0, 4, 1, 4, 3],
       [1, 0, 0, 4, 0]])

In [49]: B
Out[49]: 
array([[4, 2, 2, 1, 4],
       [2, 1, 2, 4, 2],
       [4, 0, 2, 0, 3]])

In [50]: mask = (A == B) & (A==0)

In [51]: np.where(mask, 0, A/B)
Out[51]: 
array([[ 1.  ,  0.5 ,  2.  ,  0.  ,  0.75],
       [ 0.  ,  4.  ,  0.5 ,  1.  ,  1.5 ],
       [ 0.25,  0.  ,  0.  ,   inf,  0.  ]])

相关问题 更多 >