2012-08-15 141 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列表或投它。