2013-10-15 60 views
2

我使用numpy的創建索引列表3D陣列

p = VN.vtk_to_numpy(data.GetCellData().GetArray('p')) 

從寫的.vtk文件這種方式讀取3D標:

p_x1y1z1 p_x2y1z1 p_x3y1z1 p_x4y1z1 p_x1y2z1 p_x2y2z1 p_x3y2z1 p_x4y2z1 

等,與和身邊循環xyz

我想用這些數據填充一個3D numpy數組(這是一個常規網格),像p(i,j,k)=p_ijk,所以我可以使用numpy工具箱中的漸變和其他運算符。

任何想法?

問候

+0

是否有任何新行或文件是一個巨大的單行?有沒有提供網格大小的標題信息,或者您是否事先知道它? – Nathan

+0

有9行元素(我不知道爲什麼9)。 –

回答

1

如果我正確理解你的處境,你可以reshape它。

In [132]: p = np.array("p_x1y1z1 p_x2y1z1 p_x3y1z1 p_x4y1z1 p_x1y2z1 p_x2y2z1 p_x3y2z1 p_x4y2z1".split()) 

In [133]: p 
Out[133]: 
array(['p_x1y1z1', 'p_x2y1z1', 'p_x3y1z1', 'p_x4y1z1', 'p_x1y2z1', 'p_x2y2z1', 'p_x3y2z1', 'p_x4y2z1'], 
     dtype='|S8') 

在我看來,你的陣列是用什麼numpy的要求'F'順序進行排序:

In [168]: p.reshape(4, 2, order='F') 
Out[168]: 
array([['p_x1y1z1', 'p_x1y2z1'], 
     ['p_x2y1z1', 'p_x2y2z1'], 
     ['p_x3y1z1', 'p_x3y2z1'], 
     ['p_x4y1z1', 'p_x4y2z1']], 
     dtype='|S8') 

如果你有z變化,也只是重塑三個維度:

In [169]: q 
Out[169]: 
array(['p_x1y1z1', 'p_x2y1z1', 'p_x3y1z1', 'p_x4y1z1', 'p_x1y2z1', 
     'p_x2y2z1', 'p_x3y2z1', 'p_x4y2z1', 'p_x1y1z2', 'p_x2y1z2', 
     'p_x3y1z2', 'p_x4y1z2', 'p_x1y2z2', 'p_x2y2z2', 'p_x3y2z2', 
     'p_x4y2z2', 'p_x1y1z3', 'p_x2y1z3', 'p_x3y1z3', 'p_x4y1z3', 
     'p_x1y2z3', 'p_x2y2z3', 'p_x3y2z3', 'p_x4y2z3'], 
     dtype='|S8') 

In [170]: q.reshape(4,2,3,order='F') 
Out[170]: 
array([[['p_x1y1z1', 'p_x1y1z2', 'p_x1y1z3'], 
     ['p_x1y2z1', 'p_x1y2z2', 'p_x1y2z3']], 

     [['p_x2y1z1', 'p_x2y1z2', 'p_x2y1z3'], 
     ['p_x2y2z1', 'p_x2y2z2', 'p_x2y2z3']], 

     [['p_x3y1z1', 'p_x3y1z2', 'p_x3y1z3'], 
     ['p_x3y2z1', 'p_x3y2z2', 'p_x3y2z3']], 

     [['p_x4y1z1', 'p_x4y1z2', 'p_x4y1z3'], 
     ['p_x4y2z1', 'p_x4y2z2', 'p_x4y2z3']]], 
     dtype='|S8') 

這是假設x,y,z應該映射到i+1,j+1,k+1,因爲見過她e:

In [175]: r = q.reshape(4,2,3,order='F') 

In [176]: r[0] #all x==1 
Out[176]: 
array([['p_x1y1z1', 'p_x1y1z2', 'p_x1y1z3'], 
     ['p_x1y2z1', 'p_x1y2z2', 'p_x1y2z3']], 
     dtype='|S8') 

In [177]: r[:,0] # all y==1 
Out[177]: 
array([['p_x1y1z1', 'p_x1y1z2', 'p_x1y1z3'], 
     ['p_x2y1z1', 'p_x2y1z2', 'p_x2y1z3'], 
     ['p_x3y1z1', 'p_x3y1z2', 'p_x3y1z3'], 
     ['p_x4y1z1', 'p_x4y1z2', 'p_x4y1z3']], 
     dtype='|S8') 

In [178]: r[:,:,0] #all z==1 
Out[178]: 
array([['p_x1y1z1', 'p_x1y2z1'], 
     ['p_x2y1z1', 'p_x2y2z1'], 
     ['p_x3y1z1', 'p_x3y2z1'], 
     ['p_x4y1z1', 'p_x4y2z1']], 
     dtype='|S8') 
+0

謝謝,這似乎是正確的事情,但我不知道數據被正確地導入爲numpy的陣列我得到:P = p.split()\t AttributeError的:「numpy.ndarray」對象有沒有屬性'分裂'當我這樣做: p = VN.vtk_to_numpy(data.GetCellData()。GetArray('p')) p = p.split() –

+0

哦,你可以忽略第一行,我用它來創建示例數據從你的字符串示例。該'p'你從你的'vtk_to_numpy'得到已經是一個數組,這是一個我認爲你需要重塑。當然,你不應該使用'4,2,3'而是'NX,NY,nz'任何你有'X,Y,z'值的數量。 – askewchan

+0

這是看着奇怪的方式表現了vtk_to_numpy,但多虧了你,一切正常了。萬分感謝 ! –