繁体   English   中英

用可能导致nan的numpy矩阵划分

[英]Division with numpy matrices that might result in nan

当有时两个矩阵在同一个单元格中有0时,如何在python中划分两个numpy矩阵AB

对于所有ij 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_dividewhere参数:

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)将是相等之间的所有元素的掩模AB并用(A==0)我们具有在零的所有元素的掩模A 因此,对于(A == B) & (A==0)的组合掩模,我们具有AB都为零的位置的掩模。 一个更简单的版本来完成相同的任务,也许更容易理解的是检查AB零,它将是:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM