我有一个以下格式的数据框
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'
也欢迎任何其他建议。我想尽可能高效地实现这一点!