2012-11-09 21 views
1

我試圖使用numpy從卷中提取切片。 體積是512x512x132,我希望切片編號爲66. 每個體素是一個無符號的16位整數。從numpy的卷中提取並保存切片

我的代碼是:

import numpy 

original = numpy.fromfile(filepath, dtype=numpy.uint16) 
original = numpy.reshape(original, (512,512,132)) 

slice = original[:,:,66] 

f = open('test.rawl', 'w') 
slice.tofile(f) 
f.close() 

代碼完整乾淨,但是當我打開切片與外部程序,它不是切片數據,但垃圾。

我做錯了什麼?

謝謝

+1

什麼外部程序打開numpy數組文件? – Isaac

+0

他們是原始文件,我使用MANGO,它是一個DICOM查看器,也可以打開原始數據。我認爲要保存爲numpy數組,你必須使用load()和save()。糾正我,如果我錯了。 – zhar

+0

'numpy.load()'和'numpy.save()'僅適用於基本上包含pickle數組對象的Numpy特定文件格式。 – Iguananaut

回答

1

你的第一個問題是你的軸有問題。假設你有512×512的圖像132層的層要使用:

original = numpy.fromfile(filepath, dtype=numpy.uint16).reshape((132, 512, 512)) 

然後用於切片取:

slc = original[66] 

此外,如numpy的陣列的二進制數據使用:

f = open('test.raw', 'wb') 

模式中的'b'是二進制的。否則,Python會假設你正在嘗試寫文本並執行諸如將換行符轉換爲系統適當的格式等。

順便說一句,ndarray.tofile()方法也採用一個文件名,所以除非你有一個特殊的原因,它沒有必要先創建一個文件句柄。你可以只用

arr.tofile('test.raw') 

最後要注意:儘量不要使用slice作爲變量。這是Python中的一個內置名稱,你可以通過用其他東西來隱藏它而遇到麻煩。

+0

感謝您的回答,我使用了您的建議,但問題依然存在。將Numpy View寫入文件可能是一個問題? – zhar

+0

不,這不會是問題。不知道更多關於數據應該是什麼樣子或者它是如何形成的,我不認爲有更好的答案。 您確定您正在閱讀的文件僅包含原始數據嗎?如果是這樣,它是用C語言編寫的嗎? – Iguananaut

+0

我確定它只包含原始數據。如果我寫入文件原始數組,它與原始輸入文件相同。我相信這是按C順序。我正在上傳一個示例。 – zhar