2011-04-28 47 views
1

我該如何將ndarray轉換爲numpy中的矩陣?我試圖從csv導入數據並將其轉換爲矩陣。如何將ndarray轉換爲scipy中的矩陣?

from numpy import array, matrix, recfromcsv 
my_vars = ['docid','coderid','answer1','answer2'] 
toy_data = matrix(array(recfromcsv('toy_data.csv', names=True)[my_vars])) 
print toy_data 
print toy_data.shape 

但我得到這個:

[[(1, 1, 3, 3) (1, 2, 4, 1) (1, 3, 7, 2) (2, 1, 3, 3) (2, 2, 4, 4) 
    (2, 4, 3, 1) (3, 1, 3, 3) (3, 2, 4, 3) (3, 3, 3, 4) (4, 4, 5, 1) 
    (4, 5, 6, 2) (4, 2, 4, 3) (5, 2, 5, 4) (5, 3, 3, 1) (5, 4, 7, 2) 
    (6, 1, 3, 3) (6, 5, 4, 1) (6, 2, 5, 2)]] 
(1, 18) 

什麼我必須做一個4×18矩陣,以擺脫這種代碼?這個問題應該是一個簡單的答案,但我無法找到它。

+0

爲什麼不重新塑造它而不是使用矩陣? – 2011-04-28 17:14:58

+0

重塑不會讓我將一個1x18物體轉換成4x18物體,是嗎? – Abe 2011-04-28 17:17:42

+0

如何建議將1x18對象轉換爲4x18對象?其他行從哪裏來? – 2011-04-28 17:22:39

回答

5

如果最終目標是製作矩陣,則不需要創建具有命名列的重新數組。你可以使用np.loadtxt到CSV加載到ndarray,然後用np.asmatrix將其轉換爲一個矩陣:

import numpy as np 
toy_data = np.asmatrix(np.loadtxt('toy_data.csv',delimiter=','skiprows=1)) 
print toy_data 
print toy_data.shape 

產生

[[ 1. 1. 3. 3.] 
[ 1. 2. 4. 1.] 
[ 1. 3. 7. 2.] 
[ 2. 1. 3. 3.] 
[ 2. 2. 4. 4.] 
[ 2. 4. 3. 1.] 
[ 3. 1. 3. 3.] 
[ 3. 2. 4. 3.] 
[ 3. 3. 3. 4.] 
[ 4. 4. 5. 1.] 
[ 4. 5. 6. 2.] 
[ 4. 2. 4. 3.] 
[ 5. 2. 5. 4.] 
[ 5. 3. 3. 1.] 
[ 5. 4. 7. 2.] 
[ 6. 1. 3. 3.] 
[ 6. 5. 4. 1.] 
[ 6. 2. 5. 2.]] 
(18, 4) 

注:skiprows參數用於跳過頭中csv。

+0

完美。謝謝! – Abe 2011-04-28 17:31:40

0

您只需將所有值讀入矢量,然後重新設置它即可。

fo = open("toy_data.csv") 

def _ReadCSV(fileobj): 
    for line in fileobj: 
    for el in line.split(","): 
     yield float(el) 


header = map(str.strip, fo.readline().split(",")) 
a = numpy.fromiter(_ReadCSV(fo), numpy.float64) 
a.shape = (-1, len(header)) 

但是,更新的numpy可能會有更直接的方式。