numpy - функции векторизации: apply_over_axes / apply_along_axis - PullRequest
0 голосов
/ 09 октября 2018

Я хочу вычислить определитель m m подмассивов размерных массивов am m * n и хотел бы сделать это быстрым / более элегантным способом.Подход грубой силы работает:

import numpy as n

array=n.array([[[0.,1.,2.,3.],[2,1,1,0]],[[0.5, 0.5,2,2],[0.5,1,0,2]]])
detarray=n.zeros(4)
for i in range(4):
    detarray[i]= n.linalg.det(array[:,:,i])

Я бы попытался сделать это с apply_along_axis, но я знаю, что это только для 1D-аргументов функции, и поэтому я предполагаю, что не могу заставить это работать.

Однако я думал, что apply_over_axes также должен работать:

n.apply_over_axes(n.linalg.det, array, [0,1])

, но это дает мне ошибку: «det () принимает ровно 1 аргумент (2 дано)»

Кто-нибудь знает, почему это не работает?Если этот тип вычисления действительно невозможен с apply_over_axes, есть ли лучший способ сделать это, а не цикл for?

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Используя семантику транспонирования NumPy для 3D-массивов, вы можете просто передать транспонированный массив в numpy.linalg.det() как:

In [13]: arr = np.array([[[0.,1.,2.,3.], 
                          [2, 1, 1, 0]], 

                         [[0.5, 0.5,2,2],
                          [0.5, 1, 0, 2]]])

In [14]: np.linalg.det(arr.T)
Out[14]: array([-1. ,  0.5, -2. ,  6. ])

С точки зрения производительности этот подход кажется в два раза быстрее , чем другой подход при ручном перемещении осей с использованием numpy.moveaxis

In [29]: %timeit np.linalg.det(np.moveaxis(arr, 2, 0))
12.9 µs ± 192 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

In [30]: %timeit np.linalg.det(arr.T)
6.2 µs ± 136 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
0 голосов
/ 09 октября 2018

numpy.linalg.det векторизовано из коробки.Все, что вам нужно сделать, это переместить внешние оси влево:

>>> np.linalg.det(np.moveaxis(array, 2, 0))
array([-1. ,  0.5, -2. ,  6. ])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...