2010-10-11 60 views
1

我使用以下代碼創建從一個三維陣列的2D摘要矩陣:添加文本列和行標頭numpy的陣列

numTests=len(TestIDs) 
numColumns=11 
numRows=6 
SummaryMeansArray = p.array([]) 
summary3dArray = ma.zeros((numTests,numColumns,numRows)) 

j=0 
for j in range(0,len(TestIDs)): 
    print 'j is: ',j 
    TestID=str(TestIDs[j]) 
    print 'TestID is: ',TestID 
    reader=csv.reader(inputfile) 

    m=1 
    for row in reader: 
     if row[0]!='TestID': 
      summary3dArray[j,1,m] =row[2] 
      summary3dArray[j,2,m] =row[3] 
      summary3dArray[j,3,m] =row[4] 
      summary3dArray[j,4,m] =row[5] 
      summary3dArray[j,5,m] =row[6] 
      summary3dArray[j,6,m] =row[7] 
      summary3dArray[j,7,m] =row[8] 
      summary3dArray[j,8,m] =row[9] 
      summary3dArray[j,9,m] =row[10] 
      summary3dArray[j,10,m] =row[11] 
      m+=1 
    inputfile.close() 
outputfile=open(outputFileName, "wb") 
writer = csv.writer(outputfile, delimiter=',', quotechar='"', quoting=csv.QUOTE_ALL) 
outputfile.close() 

smith='test' 

summary3dArray.mask = (summary3dArray.data == 0) # mask all data equal to zero 
summaryMeansArray = mean(summary3dArray, axis=0) # the returned shape is (numColumns,numRows) 
print 'SummaryMeansArray is: ',summaryMeansArray 

通過打印2D矩陣返回的數據是:

SummaryMeansArray is: [[-- -- -- -- -- --] 
[-- 0.872486111111 0.665114583333 0.578107142857 0.495854166667 0.531722222222] 
[-- 69.6520408802 91.3136933451 106.82865123 125.834593798 112.847127834] 
[-- 1.26883876577 1.64726525154 1.82965948427 1.93913919335 1.81572414167] 
[-- 0.0707222222222 0.0696458333333 0.0654285714286 0.06196875 0.0669444444444] 
[-- 0.219861111055 0.195958333333 0.179925 0.1641875 0.177] 
[-- 0.290583333278 0.265604166667 0.245353571429 0.22615625 0.243944444444] 
[-- 24.1924238322 23.4668576333 23.2784801383 22.8667912971 21.0416383955] 
[-- 90.7234287345 108.496149905 112.364863351 113.57480005 144.061033524] 
[-- 6.16448575902 9.7494285825 11.6270150699 13.5876342704 16.2569218735] 
[-- 0.052665615304 0.069989497088 0.0783212378582 0.0846757181338 0.0862920065249]] 

我有兩個問題:
1.)我想向summaryMeansArray添加文本行標題和列標題,但是現在我嘗試執行此操作時收到錯誤消息。 在此代碼中添加行標題和列標題的正確語法是什麼?

2)總結是指設置了11列6行的數組嗎?我的理解是正確的語法是列,行。但是,它似乎正在打印出11行6列以上的數據。這是否僅僅是因爲Python按照慣例將每列的數據分組在其自己的括號內?還是我搞砸了語法?

回答

4

1.)我建議將列和行標題信息存儲在單獨的數據結構中。 Numpy矩陣可以存儲混合的數據類型(在這種情況下是字符串和浮點數),我試圖避免它。混合數據類型很混亂,對我來說似乎效率低下。如果你願意,你可以用你的矩陣數據和標題信息在你自己的課堂上。這對我來說似乎是一個更清潔的解決方案

2.)否,summaryMeansArray設置爲11行6列。矩陣的第一維是行數。您可以使用summaryMeansArray.T獲得summaryMeansArray的轉置。當您在第0軸上使用summary3dArray的平均值時,下一個軸將成爲行,而後面的軸將成爲行。

編輯:根據請求,您可以使用方法tolist()從numpy數組中創建一個python列表。例如,

newMeansArray = summaryMeansArray.tolist() 

然後你就可以使用

newMeansArray.insert(0,headers) 

插入行標題是可以做到的插入列標題:

newMeansArray[i].insert(0,rowheader) 

每一行我。當然,如果你已經插入了列標題,那麼對於我的計數從1開始,而不是從0開始。

+0

我明白第二個答案,並且會解決它。但是,你能否簡單地向我展示答案編號1的示例代碼?我觀看了關於在python中創建類的最後一個視頻,但這對我來說仍然是新的。 – MedicalMath 2010-10-11 22:07:17

+0

可以將summaryMeansArray轉換爲常規python數組,然後爲列和行標題添加字符串值嗎?我用什麼語法? – MedicalMath 2010-10-11 22:42:28

0

我同意Justin Peel的回答,關於問題1(行/標題標籤)。

我創建了我自己的類,它允許我用我需要的額外數據來裝飾矩陣(例如:行和列標籤,每行的描述性文本或外部行的數字屬性到或與矩陣值無關)。

我用了將近2年的第一個解決方案是爲每個矩陣行設置一個對象,在那裏我將每行的矩陣值存儲在一個字典中,字典鍵(ID)提供第二條信息該對的矩陣值。這非常有用,特別是對於非矩陣矩陣,並且矩陣操作和輸出被分離得很乾淨。

但是,我遇到了這個設計的一個問題:可伸縮性。 當使用正方形對稱矩陣時,我需要一個1000x1000矩陣需要91 MB內存,一個2000x2000矩陣需要327 MB內存,以及一個5000x5000矩陣需要1900 MB內存。 對於我最近在20000x20000矩陣條目下工作的項目,我會很快耗盡所有工作站的8GB內存和更多內存。

我的第二個解決方案是有一個(ID1,ID2) - >值映射的單個字典。 與我的第一個解決方案相比,1000x1000矩陣只需要20 MB的內存。 這個解決方案在可擴展性部門也是失敗的,但以不同的方式,因爲創建和存儲C(1000 + 1,2)= 500500映射的時間超過3分鐘,而使用我的第一個設計時爲0.88秒。

我的第三個和當前的解決方案是創建numpy矩陣行/列索引和矩陣行/列標籤之間的映射。直接使用5000x5000矩陣的numpy需要我的系統上有202 MB的內存,一個10000x1000的矩陣需要774 MB,而一個20000x2000的矩陣需要3000 MB。將20000個ID映射到行/列索引需要我的系統上有5 MB內存,與值矩陣本身相比,這可以忽略不計。

如果只處理小於100x100元素的小矩陣,那麼我的第一個解決方案將會很快,並且所實現的數據結構將易於操作和擴展。但是,如果您正在考慮大規模處理,那麼我推薦第三種解決方案。

+0

對於大型矩陣,這些內存要求是使用numpy的64位浮點類型時的要求。當使用dtype = numpy.float32分配矩陣時,消耗的內存會減半。 – 2012-02-10 07:20:34