负数组的平方根的复数

时间:2017-04-11 09:11:16

标签: matlab numpy sqrt

我是从Matlab到python的新转换,我正在努力生成复杂的数组。

在matlab中我有以下代码:

  xyAxis = linspace(-127,127,255);
  [x,y] = meshgrid(xyAxis, xyAxis);
  fz = -(x.^2 + y.^2);
  ifz = sqrt(fz);

我想在python 3中复制:

  import numpy as np
  xyAxis = np.intp( np.linspace(-127, 127, 255) )
  x, y = np.meshgrid(xyAxis,xyAxis)
  fz =  - (x**2 + y**2)
  ifz = np.sqrt(fz)

但是,我收到以下错误:

  RuntimeWarning: invalid value encountered in sqrt

我做了一些谷歌搜索,我不知道如何在这种情况下模仿matlab的行为?有什么建议吗?

2 个答案:

答案 0 :(得分:4)

一种方法是将fz投射到复杂的dtype

ifz = np.sqrt(fz.astype(np.complex))

答案 1 :(得分:1)

除了@PaulPanzer建议的另一种方式 -

import numpy as np
xyAxis = np.intp( np.linspace(-127, 127, 255) )
x, y = np.meshgrid(xyAxis,xyAxis)
fz =  - (x**2 + y**2)

from numpy.lib.scimath import sqrt as csqrt
ifz = csqrt(fz)

print ifz

直接来自numpy docs

<强>输出

[[ 0.+179.60512242j  0.+178.89941308j  0.+178.19652073j ...,
   0.+178.19652073j  0.+178.89941308j  0.+179.60512242j]
 [ 0.+178.89941308j  0.+178.19090886j  0.+177.48521065j ...,
   0.+177.48521065j  0.+178.19090886j  0.+178.89941308j]
 [ 0.+178.19652073j  0.+177.48521065j  0.+176.7766953j  ...,
   0.+176.7766953j   0.+177.48521065j  0.+178.19652073j]
 ..., 
 [ 0.+178.19652073j  0.+177.48521065j  0.+176.7766953j  ...,
   0.+176.7766953j   0.+177.48521065j  0.+178.19652073j]
 [ 0.+178.89941308j  0.+178.19090886j  0.+177.48521065j ...,
   0.+177.48521065j  0.+178.19090886j  0.+178.89941308j]
 [ 0.+179.60512242j  0.+178.89941308j  0.+178.19652073j ...,
   0.+178.19652073j  0.+178.89941308j  0.+179.60512242j]]