使用可编程过滤器和paraview的python控制台从pandas数据帧中追加一个数组作为新的矢量/标量字段

时间:2018-08-27 19:36:04

标签: python pandas dataframe vtk paraview

我有一个以下格式的数据框

ID  t_0       t_1     t_2     t_n
0    .         .       .       .    
.
.
m

,我想在每个时间将每个列数组作为字段读取并追加到现有的一组vtu文件(vtkXMLUnstructuredGrid)中,以便我可以在paraview中构建其他过滤器并创建管道。

Part1 - Using the Programmable Filter

frame = pd.read_hdf('/path/to/file/frame.h5', 'table', mode='r')

ts = self.GetInputDataObject(0,0).GetInformation().Get(vtk.vtkDataObject.DATA_TIME_STEP())

t = int(ts)

wantedArray = frame.filter(['t_{}'.format(t)], axis=1)

from numpy import array

a = array(wantedArray)

output.PointData.append(a, "newField")

以上脚本有效。但是,由于数据帧很大(〜10 GB),因此当我移至下一个步骤时,会使整个过程变慢,因为在更新管道时会再次读取数据帧。有没有办法一次读取大的.h5文件并将其存储在内存中并访问数据?

Part 2 - Using paraview's python console

>>> frame = pd.read_hdf('/path/to/file/frame.h5', 'table', mode='r')
>>> view = GetActiveView()
>>> t = int(view.ViewTime)
>>> inputSource = GetActiveSource()
>>> inputData = servermanager.Fetch(inputSource)
>>> nPoints=inputData.GetNumberOfPoints()
>>> newField=paraview.vtk.vtkFloatArray()
>>> newwField.SetNumberOfValues(nPoints)
>>> newField.SetName("newField")

>>> wantedArray = frame.filter(['t_{}'.format(t)], axis=1)

>>> from numpy import array
>>> a = array(wantedArray)

>>> for k in range(nPoints):
    ...newField.SetValue(k, a[k])

>>> inputData.GetPointData().AddArray(newField)

上面的代码创建正确的字段,我可以使用

访问python控制台中的值
inputData.GetPointData().GetArray("newField").GetValue()

问题是我无法在渲染视图中可视化此数组,无法使用其他过滤器对其进行进一步处理。如何将该数组重新显示为下拉列表中的字段显示在渲染视图(gui)中?

我尝试了几项操作,例如Show()Render(),但没有用。我还尝试了以下代码段:

t = TrivialProducer() 
filter = t.GetClientSideObject()
filter.SetOutput(inputData)
t.UpdatePipeline()  

但这会引发以下错误:

AttributeError: 'NoneType' object has no attribute 'SetOutput'

也欢迎任何其他建议。我想尽可能高效地实现这一点!

0 个答案:

没有答案