2013-09-29 79 views
2

我有一個CSV文件,其中有前三列這樣Numpy.loadtxt進口數據數組的數組,而不是一個多維數組

2011,12,25,... 
2011,12,26.... 
2011,12,27,... 
... 

這些列基本上是年,月,日。其他列包含字符串。共有100行和6列。我用numpy.loadtxt得到這個到一個數組,使用

input = numpy.loadtxt('file.csv', dtype='i4, i4, i4, S4, S4, S4', delimiter=',') 

問題:據我瞭解,這loadtxt操作應應返回它的形狀100x6數組。但是,這會返回一個數組100x1,每個元素都是1x6的數組。我想這是正常的二維數組100x6。我在網上查找了一些資源。看起來,由於csv數據中的一些列包含字符串,我必須使用dtype參數,並且這會導致輸入爲數組的一維數組而非二維數組。我曾嘗試一些在這些網站給出的例子,他們似乎只要在CSV文件中的所有條目數

我所尋找的是無論是

  • 辦法精細工作我的導入數據到一個普通的2D陣列
  • 爲什麼loadtxt進口的陣列

樣品CSV文件的數組一些解釋:

2011,12,25,AAA,AAA,AAA 
2011,12,26,BBB,BBB,BBB 
2011,12,27,CCC,CCC,CCC 

回答

3

你是正確的,np.loadtxt返回一維數組,但你仍然可以訪問「列」,這實際上是一個structured array領域

array([(2011, 12, 25, b'AAA', b'AAA', b'AAA'), 
     (2011, 12, 26, b'BBB', b'BBB', b'BBB'), 
     (2011, 12, 27, b'CCC', b'CCC', b'CCC')], 
     dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<i4'), ('f3', 'S4'), ('f4', 'S4'), ('f5', 'S4')]) 

它不會讓你指數的,但你需要的名字這樣做(f0f1f2 ...),而不是指標:

nt['f3'] 
#>>> array([b'AAA', b'BBB', b'CCC'], 
#>>>  dtype='|S4') 

當然你可以指定dtype名稱:

dtype=[('MEAT', '<i4'), ('CHEESE', '<i4'), ('TOAST', '<i4'), ('BIRD', 'S4'), ('PLANE', 'S4'), ('SOCK', 'S4')] 
nt = numpy.loadtxt('/home/joshua/file.csv', dtype=dtype, delimiter=',') 

nt['SOCK'] 
#>>> array([b'AAA', b'BBB', b'CCC'], 
#>>>  dtype='|S4') 

這樣做是爲了簡化了很多,從非均勻陣列出現併發症。

+2

指定名稱的更簡單方法是使用'genfromtxt'代替:'np.genfromtxt('file.csv',dtype ='i4,i4,i4,S4,S4,S4',names ='Y, M,D,A,B,C')如果file.csv有頭名稱,你可以說'names = True',它會從文件中加載它們。 – askewchan

+0

+1謝謝@Veedrac和@askewchan。我嘗試使用'loadtxt'和'genfromtxt'。兩者都很好。目前我正在使用'genfromtxt',因爲@askewchan指出,它確實更容易。謝謝您的幫助! – playercharlie