2013-08-16 92 views
2

計算器,numpy的讀取用的.csv複數

我有一個包含複數的矩陣(例如:-2.2982235934153075E-11 + 2.1179547211742553E-9I),我需要導入到numpy的陣列。我一直在使用genfromtext(file)來解析我所有的其他實際值,但是我得到了所有複雜值的nan。有任何想法嗎?

self.raw = (genfromtxt(self.loc, delimiter=',', skip_header=9, dtype=float)) 
[m,n] = shape(self.raw) 
data = zeros((m, n-3)) 
data[:, :] = self.raw[:, 3::] 

回報:

data = array([nan, nan, nan, ...]) 
+0

粘貼您使用的一些代碼並將其粘貼的示例性輸入(優選地,輸入文件的一部分) –

回答

1

我最後不得不方式要做到這一點是首先replace('i', 'j')原始.csv文件中的所有單元格,並保存新的,更正的文件。之後,使用dtype=str讀取.csv在後續計算中導致錯誤,但事實證明,您可以使用dtype=complex128解析.csv,這解決了我所有的問題。感謝您對轉換的幫助@ Saullo-Castro

3

你可以這樣做:

import numpy as np 
a = np.genfromtxt(filename, converters={0: lambda x: x.replace('i','j')}, 
        dtype=str) 
a = np.complex_(a) 

注意,因爲你的文本文件使用i表示虛部converters參數被要求。

它可能會更容易轉換成文本文件外的所有i通過j來代替,避免在情況複雜converters參數,你有很多列。

如果與虛數的文本文件有以下格式:

(-2.298223593415307508e-11+2.117954721174255306e-09j) 
(-2.298223593415307508e-11+2.117954721174255306e-09j) 
(-2.298223593415307508e-11+2.117954721174255306e-09j) 
(-2.298223593415307508e-11+2.117954721174255306e-09j) 
(-2.298223593415307508e-11+2.117954721174255306e-09j) 
(-2.298223593415307508e-11+2.117954721174255306e-09j) 
(-2.298223593415307508e-11+2.117954721174255306e-09j) 

在那裏你可以只讀使用:

a = np.loadtxt(filename).view(complex) 

例如...

+3

這適用於一列。看起來數據假設是多列的。我可能會在數據文件中外部轉換'i' - >'j',也許使用sed,awk甚至perl !,然後使用dtype = np.complex讀取轉換後的文件。 –

+0

如果您可以將它轉換到外部在這種情況下不需要使用'converters'參數... –

+1

正確,您不必擔心文件中的實際列數。 OP的限制條件並不完全清楚。 –

-1

將csv文件導入爲genfromtxt(...)dtype='str'的字符串數組。然後你可以用np.vectorize(...)操作每個條目。

import numpy as np 
from numpy import genfromtxt 

# import data as an array of strings using the dtype 
temp = genfromtxt('matlab_sim_Z.csv', delimiter=',',dtype='str') 

# perform elementwise conversion to complex numpers 
mapping = np.vectorize(lambda t:complex(t.replace('i','j'))) 
data = mapping(temp) 

在一行:

data = np.vectorize(lambda t:complex(t.replace('i','j'))) (genfromtxt('matlab_sim_Z.csv', delimiter=',',dtype='str'))