Skip to main content
 首页 » 编程设计

python之numpy 从索引列表创建 3D 数组

2025年05月04日8bjzhanghao

我在用

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')