在 Paraview 可编程过滤器中使用 numpy 数组

计算科学 Python 可视化 麻木的 视界
2021-11-28 20:21:45

如何将 Paraview 的可编程过滤器中的字段作为 numpy 数组访问?

我想要:

  • 将现有字段导入为 numpy 数组
  • 为输出创建一个类似的数组
  • 将其注册为可视化的新字段

我对wiki很熟悉,但它并没有解决这个问题。

给定这个例子:

elev0 = inputs[0].PointData['Elevation']
elev1 = inputs[1].PointData['Elevation']
output.PointData.append(elev1 - elev0, 'difference')

我想做(假设 elev0 和 elev1 是 numpy 数组):

diff = elev1 - elev0
diff[ diff > 1.0 ] = 1.0
output.PointData.append(diff, 'difference')

但这不起作用,因为它们是 VTKArray 对象。

2个回答

阅读 Paraview python API,发现以下解决方案在 VTKArray 和 numpy 数组之间来回转换。这使用numpy_supportvtk.dataset_adapter模块:

from paraview.numpy_support import vtk_to_numpy
from paraview.vtk.dataset_adapter import numpyTovtkDataArray, vtkDataArrayToVTKArray
import numpy as np

# get paraview.vtk.dataset_adapter.VTKArray object
vtkArr = inputs[0].PointData['Elevation']
# convert to numpy array, shape is (nNodes,) for scalars, (nNodes,nComponents) for vectors
npArr = vtk_to_numpy(vtkArr)
# do math on a copy so that original field is not altered
npArr2 = npArr.copy()
npArr2 *= 2.0
# convert back to VTKArray
vtkArr2 = vtkDataArrayToVTKArray(numpyTovtkDataArray(npArr2))
# append new field to output
output.PointData.append(vtkArr2, 'New field')

使用 ParaView 4.2,您的原始代码将按预期工作。现在可以接受以下内容。

output.PointData.append(numpyarray, "name")