2013-10-15 63 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,但多亏了你,一切正常了。万分感谢 ! –