2017-11-28 8 views
4

다음과 같은 문제가 있습니다. 다음과 같은 배열이 있습니다.Numpy 배열에서 vtk 테이블

arr = np.array([[ 1. , 1. , 4. , 3. , 6. , 12. , -1. , 1.], 
[ 1. , 2. , 2., 2., 10. , 6. , -2. , 2.], 
[ 1. , 2. , 3. , 4. , 4. , 11. , -2. , 3.], 
[ 1. , 2. , 3. , 6., 8. , 9. , 1. , 4.], 
[ 1. , 2. , 6. , 7. , 4., 14. , 1. , 5.], 
[ 1. , 2. , 7. , 4. , 2. , 17. , -0. , 6.], 
[ 1. , 3. , 2. , 6. , 7. , 3. , -1. , 7.], 
[ 1. , 3. , 4. , 1. , 3. , 14. , 0. , 8.], 
[ 1. , 3. , 5. , 5. , 1. , 16. , -1. , 9.], 
[ 1. , 3. , 6. , 2. , 9. , 19. , 1. , 10.], 
[ 1. , 4. , 3. , 1. , 1. , 7. , -1. , 11.], 
[ 1. , 4. , 4. , 5. , 9. , 10. , 2. , 12.], 
[ 1. , 4. , 5. , 3. , 6. , 18. , 0. , 13.], 
[ 1. , 4. , 6. , 6. , 5. , 2. , -1. , 14.], 
[ 1. , 5. , 1. , 4. , 3. , 5. , 1. , 15.], 
[ 2. , 1. , 2. , 7. , 2. , 19. , -1. , 16.], 
[ 2. , 1. , 3. , 2. , 3. , 16. , -2. , 17.]]) 

이제 이것을 vtk 테이블로 변환하고 싶습니다. 이것이 가능한가?

감사합니다.

+0

이 링크가 필요한 경우 유용할까요? https://pyscience.wordpress.com/2014/09/06/numpy-to-vtk-converting-your-numpy-arrays-to-vtk-arrays-and-files / –

답변

4

내가 다음과 같은 방법으로 그렇게 할 수있을 수 있다고 생각한다

# create the vtkTable object 
tab = vtk.vtkTable() 

# create a vtkDataArray with arr values 
vtkarr = vtk.vtkDoubleArray() 
vtkarr.SetNumberOfComponents(arr.shape[1]) 
vtkarr.SetNumberOfTuples(arr.shape[0]) 
vtkarr.SetVoidArray(arr, arr.size, 0) 

# finally assign the values to the vtkTable 
tab.GetRowData().AddArray(vtkarr) 

내가 SetVoidArray()을 사용 왜 값의 불필요한 복사를 방지하기 위해 노력했다. 그래서 기본적으로 첫 번째 인수는 배열 자체이고, 두 번째 인수는 배열에있는 요소의 총 개수이며, 마지막 요소는 vtkTable 개체가 원시 데이터의 할당을 해제할지 여부를 알려줍니다 (이 경우에는 그렇게됩니다).

import numpy as np 
import vtk 
from vtk.util import numpy_support 

arr = np.array([[ ... ]]) 

vtkarr = numpy_support.numpy_to_vtk(arr, deep=True, array_type=vtk.VTK_DOUBLE) 

# create the vtkTable object 
tab = vtk.vtkTable() 
tab.GetRowData().AddArray(vtkarr) 

참고 : 내부적으로 numpy_to_vtk이 SetVoidArray()과를 사용하는 것

1

다른 방법은 VTK의 numpy_support 모듈을 사용하는 것입니다.


당신은 당신이 다음 arr.ravel()를 사용하여 평평하게 numpy_to_vtk를 사용하여 vtkArray로 변환 한 후 구성 요소의 수를 "수정"수, 멀티 dimensionsional 데이터를 복사, 나처럼, 여기에 제공된 경우 튜플 당) (vtkArray.SetNumberOfComponents를 사용 :

# arr is a 3xNxNxN array 

    # Make sure the dimension which you want to make up the tuples is at the end. 
    # In our case, dimension 0 (the 3) is what we want to be in each tuple, 
    # so we move it to the end: 
    arr = numpy.transpose(arr, (1,2,3,0)) 
    # Convert the array to vtk. ravel() flattens the array and makes sure 
    # it's contiguous: 
    vtkarr = numpy_support.numpy_to_vtk(arr.ravel(), deep=True, array_type=vtk.VTK_DOUBLE) 
    # "Fix" the number of components: 
    vtkarr.SetNumberOfComponents(3) 
    vtkarr.SetNumberOfTuples(N*N*N) 

    vtkarr.SetName("DisplacementField") 
    cellData.AddArray(vtkarr) 

은 자세한 내용 this blog post를 참조하십시오.