Как рассчитать собственные значения в paraview с помощью python?

У меня есть данные ячейки F, которые представляют собой массив матриц 3x3. Как я могу рассчитать sqrt (собственные значения матриц F * F.T), а затем добавить эти новые данные ячейки?

Обновление 1: это мой код. Не работает из-за строки

C = F.Arrays[0] * F.Arrays[0].T

Как я могу решить это?

import numpy as np
import vtk
from vtk.numpy_interface import dataset_adapter as da
from paraview.numpy_support import vtk_to_numpy
from paraview.vtk.numpy_interface import algorithms
from paraview.vtk.numpy_interface.algorithms import sqrt as sqrt
from paraview.vtk.numpy_interface.algorithms import eigenvalue as eigenvalue

# This is a VTKCompositeDataArray
F = inputs[0].GetCellData().GetArray('F')

# Of course it does not work! Error:
#   ValueError: operands could not be broadcast together 
#   with shapes (60,3,3) #(3,3,60)
# How to solve it?
C = F.Arrays[0] * F.Arrays[0].T
Eigs = sqrt(eigenvalue(C))
output.CellData.append(Eigs, "EigenValues")

person Caslu    schedule 23.03.2018    source источник
comment
Взгляните на этот вопрос: stackoverflow.com/questions/46132843/ Это должно позволить вам преобразовать ваши данные в массив numpy и использовать numpy для вычисления любой матричной операции.   -  person Mathieu Westphal    schedule 26.03.2018
comment
Спасибо @MathieuWestphal, но, к сожалению, это мне не помогло. Я попытался преобразовать VTK в numpy, получить собственные значения, а затем преобразовать их обратно. Не сработало! Итак, я решил использовать только VTKArrays, и это тоже не сработало.   -  person Caslu    schedule 27.03.2018
comment
Не знаю, но массивы vtk не поддерживают прямое вычисление. Я бы посоветовал задать вопрос в списке рассылки paraview.   -  person Mathieu Westphal    schedule 28.03.2018
comment
На самом деле они поддерживают прямые вычисления, но они ограничены.   -  person Caslu    schedule 28.03.2018


Ответы (1)


Я нашел способ:

import numpy as np
import vtk
from vtk.numpy_interface import dataset_adapter as da
from vtk.numpy_interface.algorithms import sqrt as sqrt
from vtk.numpy_interface.algorithms import eigenvalue as eigenvalue
from numpy import linalg as LA

F = inputs[0].GetBlock(0).GetCellData().GetArray('F')

arr = []
for j in range(0, F.GetNumberOfTuples()) :
    f = F.GetTuple(j)
    f = np.reshape(f, (3,3))
    f = f.T*f
    lmbda = np.sqrt(LA.eigvals(f))
    arr.append(lmbda)

vtk_arr = da.VTKArray(arr)
output.CellData.append(vtk_arr,"Lambdas")
person Caslu    schedule 28.03.2018