如果您尝试使用上面Joe的答案,您会得到:
traits.trait_errors.TraitError: ImageMarchingCubes实例的“input”特性为“只读”。
这里是所需更改以及显示如何修复它的差异。
import numpy as np
from tvtk.api import tvtk
from tvtk.common import configure_input
def main():
x, y, z = np.mgrid[-2:2:20j, -2:2:15j, -2:2:5j]
r = np.sqrt(x**2 + y**2 + z**2)
dx, dy, dz = [np.diff(it, axis=a)[0, 0, 0] for it, a in zip(
(x, y, z), (0, 1, 2))]
max_radius = 1.5
data = (r <= max_radius).astype(np.int8)
ideal_volume = 4.0 / 3 * max_radius**3 * np.pi
coarse_volume = data.sum() * dx * dy * dz
est_volume = vtk_volume(data, (dx, dy, dz), (x.min(), y.min(), z.min()))
coarse_error = 100 * (coarse_volume - ideal_volume) / ideal_volume
vtk_error = 100 * (est_volume - ideal_volume) / ideal_volume
print('Ideal volume', ideal_volume)
print('Coarse approximation', coarse_volume, 'Error', coarse_error, '%')
print('VTK approximation', est_volume, 'Error', vtk_error, '%')
def vtk_volume(data, spacing=(1, 1, 1), origin=(0, 0, 0)):
data[data == 0] = -1
grid = tvtk.ImageData(spacing=spacing, origin=origin)
grid.point_data.scalars = data.T.ravel()
grid.point_data.scalars.name = 'scalars'
grid.dimensions = data.shape
iso = tvtk.ImageMarchingCubes()
configure_input(iso, grid)
mass = tvtk.MassProperties()
configure_input(mass, iso)
return mass.volume
if __name__ == '__main__':
main()
2a3,4
> from tvtk.common import configure_input
>
6c8
<
---
>
8c10
< x,y,z = np.mgrid[-2:2:20j, -2:2:15j, -2:2:5j]
---
> x, y, z = np.mgrid[-2:2:20j, -2:2:15j, -2:2:5j]
11c13,14
< dx, dy, dz = [np.diff(it, axis=a)[0,0,0] for it, a in zip((x,y,z),(0,1,2))]
---
> dx, dy, dz = [np.diff(it, axis=a)[0, 0, 0] for it, a in zip(
> (x, y, z), (0, 1, 2))]
24,26c27,30
< print 'Ideal volume', ideal_volume
< print 'Coarse approximation', coarse_volume, 'Error', coarse_error, '%'
< print 'VTK approximation', est_volume, 'Error', vtk_error, '%'
---
> print('Ideal volume', ideal_volume)
> print('Coarse approximation', coarse_volume, 'Error', coarse_error, '%')
> print('VTK approximation', est_volume, 'Error', vtk_error, '%')
>
28c32
< def vtk_volume(data, spacing=(1,1,1), origin=(0,0,0)):
---
> def vtk_volume(data, spacing=(1, 1, 1), origin=(0, 0, 0)):
31c35
< grid.point_data.scalars = data.T.ravel()
---
> grid.point_data.scalars = data.T.ravel()
35,36c39,44
< iso = tvtk.ImageMarchingCubes(input=grid)
< mass = tvtk.MassProperties(input=iso.output)
---
> iso = tvtk.ImageMarchingCubes()
> configure_input(iso, grid)
>
> mass = tvtk.MassProperties()
> configure_input(mass, iso)
>
39c47,49
< main()
---
>
> if __name__ == '__main__':
> main()
- 运行2to3以便在python 3中运行
- 根据autopep8的要求修复代码以符合PEP8标准(包括语法、长度和间距更改)
- 由于TVTK中的这些更改(Github代码更改),需要导入configure_imput
- 修改
ImageMarchingCubes
构造函数中的input=
kwarg
- 修改
MassProperties
构造函数中的input=
kwargs
- 将对main()的调用封装在直接调用中(以防止被导入时执行)#最佳实践
nx * dx * ny * dy * nz * dz
,但我很确定你不是这个意思... 你是想要等值面内部的体积吗? - Joe Kingtonpickle.dump
保存NumPy数组即可。 - wimpickle.dump(data, f, pickle.HIGHEST_PROTOCOL)
或者,你可以直接使用numpy.save
。此外,我们无法加载你的数据,因为你pickled某种dataStructures
对象,而没有你的代码,我们无法unpickle它。尝试只pickle numpy数组和一个(dx, dy, dz)
元组。 - Joe Kington