
[英]Python 3 numpy uses integer division on matrices and regular division on vectors?
[英]Division with numpy matrices that might result in nan
当有时两个矩阵在同一个单元格中有0时,如何在python中划分两个numpy矩阵A
和B
?
对于所有i
, j
A[i,j]>=B[i,j]
基本上A[i,j]>=B[i,j]
。 我需要计算C=A/B
但有时A[i,j]==B[i,j]==0
。 当发生这种情况时,我需要A[i,j]/B[i,j]
定义为0。
除了遍历所有索引之外,还有一种简单的pythonic方式吗?
你可以使用像np.true_divide
这样的np.true_divide
的where
参数:
np.true_divide(A, B, where=(A!=0) | (B!=0))
如果您没有负值(如评论中所述)和每个元素的A >= B
(如问题中所述),您可以将其简化为:
np.true_divide(A, B, where=(A!=0))
因为A[i, j] == 0
意味着B[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. ]]
作为替代方案:在分裂后替换nan
s:
C = A / B # may print warnings, suppress them with np.seterrstate if you want
C[np.isnan(C)] = 0
你可以使用一个带有np.where
的掩码来选择这样一个A and B being both zeros
的情况, 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
和B
并用(A==0)
我们具有在零的所有元素的掩模A
。 因此,对于(A == B) & (A==0)
的组合掩模,我们具有A
和B
都为零的位置的掩模。 一个更简单的版本来完成相同的任务,也许更容易理解的是检查A
和B
零,它将是:
mask = (A==0) & (B==0)
关于np.where
的使用,它的语法是:
C = np.where(mask, array1, array2)
即我们会根据面具选择用于分配C
的元素。 如果相应的mask元素为True
,我们从array1
选择相应的元素,否则从array2
。 这是在元素级别完成的,因此,我们有输出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. ]])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.