Векторизация функции Numpy

Например, я хочу векторизовать функцию, возвращающую определитель матрицы.

Поэтому я пробую следующие коды:

data1test=np.random.rand(2,2)
data2test=np.random.rand(2,2)
data3test=np.random.rand(2,2)
data4test=np.random.rand(2,2)
fulldata=np.array((data1test,data2test,data3test,data4test))

def det_vec():
    return np.vectorize(np.linalg.det)
myfunc=det_vec()
myfunc(fulldata)

Однако он возвращает ошибку «LinAlgError: задан 0-мерный массив. Массив должен быть как минимум двумерным».

Может ли кто-нибудь показать мне, в чем проблема? Спасибо!

Если я не ошибаюсь, происходит то, что numpy пытается взять определитель каждого отдельного элемента в каждом из ваших массивов, а не просто сопоставляет функцию с каждым тестовым массивом. Что-то вроде stackoverflow.com/questions/67359587/… может быть актуально.

StardustGogeta 22.04.2024 20:23

Что указано в документах det? Ввод (..., M, M) array_like означает, что он принимает многомерный массив, последние два измерения которого одинаковы. И возвращает результат (...), то есть det каждого подмассива (M,M). Что такое fulldata.shape?

hpaulj 22.04.2024 20:29

Не используйте np.vectorize, не прочитав (и не попытавшись понять) его документацию. Обратите внимание на то, что он на самом деле говорит, а не на то, что вы хотели бы. vectorize передает скалярные значения в вашу функцию — если вы не укажете signature, что медленнее. Это не инструмент «производительности».

hpaulj 22.04.2024 20:30
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Казалось бы, ваша векторизованная функция векторизуется слишком глубоко.

Вы можете использовать аргумент signature, чтобы обойти это и принудительно векторизировать только на верхнем уровне:

>>> myfunc = np.vectorize(np.linalg.det, signature = "(a,b,c)->(a)")
>>> myfunc((np.eye(2), np.array([[1,3],[4,2]])))
array([  1., -10.])

Обновлено: стоит отметить, что @hpaulj прав - здесь даже не обязательно явная векторизация. См. следующее:

>>> np.linalg.det((np.eye(2), np.array([[1,3],[4,2]])))
array([  1., -10.])

Другие вопросы по теме