Numpy linalg на многомерных массивах - PullRequest
1 голос
/ 10 февраля 2012

Есть ли способ, например, использовать numpy.linalg.det или numpy.linalg.inv в массиве nx3x3 (линия в многополосном изображении)? Сейчас я делаю что-то вроде:

det = numpy.array([numpy.linalg.det(i) for i in X])

но наверняка есть более эффективный способ. Конечно, я мог бы использовать map:

det = numpy.array(map(numpy.linalg.det, X))

Есть еще какой-нибудь более прямой путь?

Ответы [ 2 ]

3 голосов
/ 10 февраля 2012

Я почти уверен, что нет более эффективного способа, чем у вас.Вы можете сэкономить некоторую память, сначала создав пустой массив для результатов и записав все результаты непосредственно в этот массив:

res = numpy.empty_like(X) 
for i, A in enumerate(X):
    res[i] = numpy.linalg.inv(A)

Это не будет быстрее, хотя - будет использовать только меньше памяти.

1 голос
/ 10 февраля 2012

«нормальный» определитель определен только для матрицы (размерность = 2), поэтому, если вы этого хотите, я не вижу другого пути.

если вы действительно хотите вычислить определитель куба, вы можете попытаться реализовать один из способов, описанных здесь: http://en.wikipedia.org/wiki/Hyperdeterminant

обратите внимание, что оно не обязательно совпадает со значением, которое вы сейчас вычисляете.

...