python:如何将复数替换为-1?

-2 投票
2 回答
814 浏览
提问于 2025-04-18 11:10

我发现了一个叫做 isinstance 的方法,它可以判断一个数字是否是复数。我的数据看起来是这样的。

[[ 2.48983949+0.j          0.51935128+0.j          0.50851186+0.j
   0.49747311+0.j          0.48621321+0.j          0.47549854+0.j
   0.32583775+0.j          0.32263812+0.j          0.31966799+0.j
   0.31415193+0.j          0.31590046+0.j          0.31224772+0.j
   0.30953578+0.j        ]
 [ 2.78263801+0.j          0.47996998+0.j          0.46950057+0.j
   0.45938939+0.j          0.44934962+0.j          0.43981685+0.j
   0.30778303+0.j          0.30533936+0.j          0.30283312+0.j
   0.30045755+0.j          0.29776178+0.j          0.29601522+0.j
   0.29394237+0.j        ]
 [ 0.00000000+0.86404032j  0.44030961+0.j          0.43096323+0.j
   0.42117570+0.j          0.41239587+0.j          0.40406585+0.j
   0.29059586+0.j          0.28840336+0.j          0.28632998+0.j
   0.28435365+0.j          0.28251060+0.j          0.28053645+0.j
   0.27894779+0.j        ]]

所以这些数据是一个二维的 numpy 数组。

我想把虚数替换成 -1。我该怎么做呢?

2 个回答

1

最好的方法是使用numpy数组。假设你有一个数组:

In [106]: y
Out[106]:
array([[ 1.+0.j,  2.+0.j,  1.+0.j],
       [ 1.+0.j,  2.+0.j,  1.+0.j],
       [ 2.+3.j,  2.+0.j,  3.+0.j]])

然后,

In [107]: y.imag > 0
Out[107]:
array([[False, False, False],
       [False, False, False],
       [ True, False, False]], dtype=bool)

你可以用这个来把某些东西替换成1:

In [108]: y[y.imag > 0] = -1

In [109]: y
Out[109]:
array([[ 1.+0.j,  2.+0.j,  1.+0.j],
       [ 1.+0.j,  2.+0.j,  1.+0.j],
       [-1.+0.j,  2.+0.j,  3.+0.j]])
2

如果我理解正确的话,你可以这样做:

>>> arr = np.array([[1,2+3j,4+5j],[6+7j,8,9],[10+11j,12,13+14j]])
>>> arr
array([[  1. +0.j,   2. +3.j,   4. +5.j],
       [  6. +7.j,   8. +0.j,   9. +0.j],
       [ 10.+11.j,  12. +0.j,  13.+14.j]])
>>> arr[abs(arr.imag) > 0] = -1
>>> arr
array([[  1.+0.j,  -1.+0.j,  -1.+0.j],
       [ -1.+0.j,   8.+0.j,   9.+0.j],
       [ -1.+0.j,  12.+0.j,  -1.+0.j]])

然后(因为我们构造的时候所有的虚部都是零),如果需要的话,我们可以只处理实部:

>>> arr.real
array([[  1.,  -1.,  -1.],
       [ -1.,   8.,   9.],
       [ -1.,  12.,  -1.]])

(更新:正如Floris所提到的,arr.imag != 0会比abs(arr.imag) > 0更好。这两种方法都能用,但前者更简单也更快。)

撰写回答