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

标签 python arrays numpy gradient vtk

我在用

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 工具箱的运算符。

有什么想法吗?

问候

最佳答案

如果我正确理解你的情况,你可以 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/

相关文章:

java - 用作垃圾收集的同步锁的对象数组

c - 在 C 中解析 JSON 数组

arrays - Python3从列表创建数组(我认为)

python - 使用 casefold() 时,出现错误,因为 "AttributeError: ' str' 对象没有属性 'casefold'“

python - 元组列表分为两个列表

python - Jupyter 使 3D matplotlib 图形变得非常小

python - Python 中的命名结构化数据存储

python - NumPy loadtxt()

python - 为什么我的numpy文件比使用同一数组生成的PNG大?

python - 简化 Python 中偶数点和非奇数点处两个 numpy 数组的合并