我在用
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
等等,围绕x
、y
和z
进行循环。
我想用这些数据填充一个 3D numpy 数组(它是一个规则的网格),类似于 p(i,j,k)=p_ijk
这样我就可以使用渐变和其他来自 numpy 工具箱的运算符。
有什么想法吗?
问候
最佳答案
如果我正确理解你的情况,你可以 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
,如下所示:
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')
关于python - numpy 从索引列表创建 3D 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19382088/