Как передать np.apply_along_axis в функцию с 3 аргументами - PullRequest
0 голосов
/ 07 февраля 2020

Я хочу использовать np.apply_along_axis для функции с 3 аргументами PrintR (180, res, q), где q - это ось 0 массива.

ost = array([[[array([0.2, 0. , 0. , 0.]), array([0. , 0.2, 0. , 0. ]),array([0. , 0. , 0.1, 0.1]), array([0.2, 0. , 0. , 0. ])]],
       [[array([[0],[0],[0],[0]]),array([[0],[0],[0],[0]]),array([[0],[0],[0],[0]]),array([[0],[0],[0],[0]])]],
       [[array([[0],[0]]), array([[0],[0]]),array([[0],[0]]), array([[0],[0]])]]], dtype=object).

Итак, ось 0 дает массив 3,1, поэтому у меня есть 4 столбца и 3 строки.

Как мне передать np.apply _along_axis? Я пытаюсь это, но получаю ошибку.

apply_along_axis() missing 2 required positional arguments: 'axis' and 'arr'.

Мой код:

yt = np.apply_along_axis(printR(360,res,q=([0,ost)))

1 Ответ

0 голосов
/ 07 февраля 2020

Ваша ost форма:

In [56]: ost.shape                                                                             
Out[56]: (3, 1, 4)

Это потому, что q из предыдущего вопроса создает массив (3,1) и применяется к 4 столбцам P, делает этот трехмерный массив.

Вы не можете использовать apply_along_axis для передачи (3,1) массивов в printR

Из документов:

Выполнить func1d(a, *args), где func1d работает с 1-D массивами, а a - это 1-D срез arr вдоль axis.

Вы должны заплатить, чтобы закрыть внимание к требованиям apply_along_axis. Если вы не полностью понимаете их, придерживайтесь чего-то более простого, такого как простая итерация Python. apply... - это , а не инструмент для измерения скорости.

Я рекомендую использовать apply_along_axis, только если у вас есть массив 3d или больше, где итерация по двум или более осям будет многословной (несколько вложенных для петель). Даже тогда это не сделает код быстрее. То, что numpy имеет такую ​​служебную функцию, не означает, что вы должны ее использовать.

...