Numpy数组,花式索引,复数

3
以下代码将数组的一部分乘以一个数字:
def mul_by_num(a,b):
    a[0:2] *= b


import numpy as np
a = np.ones(5,dtype=np.float64)
mul_by_num(a,1.0)
mul_by_num(a,1j) #Generates a warning (and casts to float!)

第二次调用会生成一个警告。
-c:2: ComplexWarning: Casting complex values to real discards the imaginary part

问题是,什么是最符合Python风格的方式,可以将numpy数组的部分与复杂/实数相乘而不影响数据类型? 我并不想从一开始就将数组转换为复数,但程序原则上可以获得复杂输入。
编辑:
我不在意复制整个数组,将其转换为复数; 但我想避免检查数据类型(即np.float32、np.float64、np.complex、np.int等)。

我认为你会发现这并不存在。 - Ignacio Vazquez-Abrams
@IgnacioVazquez-Abrams 我在问题中添加了一条评论,我只想避免对可能的数据类型进行完整检查。例如,a + b可以正常工作,但是赋值数组的一部分则不行。 - Ivan Oseledets
2个回答

5

你最终需要把数组转换为复数,否则它将无法存储复数。

将数组转换为复数的最简单方法是添加0j

if (np.iscomplexobj(b)):
    a = a + 0j
a[0:2] *= b

注意: 不要使用a += 0j,因为这会尝试就地修改数组,如果它还不是复数,则无法正常工作。


这没问题,但如果b是实数,并且我不想在这种情况下转换为复数呢? - Ivan Oseledets
在这种情况下,请使用np.iscomplexobj(b)进行检查,@IvanOseledets。 - ecatmur

0

由于加快计算速度,numpy数组确保具有相同的类型。您可以尝试使用Python列表或进行强制转换。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接