2012-08-15 87 views
3

下面的代码由一些numpy的阵列,花式索引,复数

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 

问题是乘以阵列的一部分,什么是大多数pythonic的方式乘numpy数组的部分复数/实数而不与dtypes混淆?我真的不想从一开始就将数组转换为复数,但程序原则上可以获得复杂的输入。

编辑:

我不在乎复制全阵列,它铸造复杂;但我想避免检查dtypes(即,np.float32,np.float64,np.complex,np.int等)

+0

我想你会发现没有一个。 – 2012-08-15 06:54:01

+0

@ IgnacioVazquez-Abrams我对这个问题添加了一个评论,我只是想避免对可能的dtypes进行全面检查。例如,a + b工作得很好,但是分配数组的一部分却没有。 – 2012-08-15 06:59:27

回答

5

您将需要在某个时刻将数组转换为复数,否则它将无法保存复数。

到一个数组转换为复杂的最简单的方法是添加0j

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

注:a += 0j仿佛它不是一条试图将就地修改数组,这将无法正常工作” t已经复杂了。

+0

没关系,但如果b是真实的,我不想在这种情况下转换为复杂的? – 2012-08-15 08:44:49

+0

@IvanOseledets在这种情况下检查'np.iscomplexobj(b)'。 – ecatmur 2012-08-15 09:20:20

0

由于增加了计算速度,numpy数组确保具有相同的类型。也许你可以尝试python列表或投它。