我是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]])
您的划分也可以用divide
ufunc表示:
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 ]])
这既给出了期望的结果,又避免了警告。