在python中是否有一种方法在numpy中计算(1/0+0j)时不生成(nan*j) ?



我是python的新手,我正在将一些Matlab脚本转换为python。当我需要获得数组元素的倒数时,我在使用numpy处理复杂数组时遇到了这个问题。如果元素是0+0j,那么倒数是:1/(0+0j)= inf+nanj。例子:

import numpy as np
array1 = np.array([[6+2j, 6], [0, 4]])
print(array1)
reciprocal_array = 1/array1
print(reciprocal_array)
而在Matlab中,1/(0+0j)的结果只有inf

但是在python中,想象的NAN给我带来了一个问题。我需要这些假想的NAN (nanj)不在这里。有什么办法不让它们存在吗?我找到了一种方法来摆脱nanj在倒数数组后,我生成它,但我问是否有更可行的解决方案。

where_are_nans = np.isnan(array1 )
array1[where_are_nans] = np.inf

您的示例数组:

In [34]: array1
Out[34]: 
array([[6.+2.j, 6.+0.j],
[0.+0.j, 4.+0.j]])

创建两个数组:

In [35]: out = np.full_like(array1, np.inf+0j)    
In [36]: out
Out[36]: 
array([[inf+0.j, inf+0.j],
[inf+0.j, inf+0.j]])
In [37]: cond = array1!=0    
In [38]: cond
Out[38]: 
array([[ True,  True],
[False,  True]])

您的划分也可以用divideufunc表示:

In [39]: 1/array1
C:UserspaulAppDataLocalTempipykernel_9642387133254.py:1: RuntimeWarning: divide by zero encountered in true_divide
1/array1
C:UserspaulAppDataLocalTempipykernel_9642387133254.py:1: RuntimeWarning: invalid value encountered in true_divide
1/array1
Out[39]: 
array([[0.15      -0.05j, 0.16666667+0.j  ],
[       inf +nanj, 0.25      +0.j  ]])
In [40]: np.divide(1,array1)
C:UserspaulAppDataLocalTempipykernel_9642318703765.py:1: RuntimeWarning: divide by zero encountered in true_divide
np.divide(1,array1)
C:UserspaulAppDataLocalTempipykernel_9642318703765.py:1: RuntimeWarning: invalid value encountered in true_divide
np.divide(1,array1)
Out[40]: 
array([[0.15      -0.05j, 0.16666667+0.j  ],
[       inf +nanj, 0.25      +0.j  ]])

ufunc接受一个where参数,告诉它在哪里进行除法。它还需要一个out数组,告诉它在其他地方使用什么:

In [41]: np.divide(1,array1,where=cond, out=out)
Out[41]: 
array([[0.15      -0.05j, 0.16666667+0.j  ],
[       inf+0.j  , 0.25      +0.j  ]])

这既给出了期望的结果,又避免了警告。

最新更新