Я только что случайно обнаружил, что могу смешивать выражения sympy с массивами numpy:
>>> import numpy as np
>>> import sympy as sym
>>> x, y, z = sym.symbols('x y z')
>>> np.ones(5)*x
array([1.0*x, 1.0*x, 1.0*x, 1.0*x, 1.0*x], dtype=object)
# I was expecting this to throw an error!
# sum works and collects terms etc. as I would expect
>>> np.sum(np.array([x+0.1,y,z+y]))
x + 2*y + z + 0.1
# dot works too
>>> np.dot(np.array([x,y,z]),np.array([z,y,x]))
2*x*z + y**2
>>> np.dot(np.array([x,y,z]),np.array([1,2,3]))
x + 2*y + 3*z
Это очень полезно для меня, потому что я выполняю как числовые, так и символьные вычисления в одной и той же программе.Однако мне любопытно, какие подводные камни и недостатки этого подхода - например, кажется, что ни np.sin
, ни sym.sin
не поддерживаются в массивах Numpy, содержащих объекты Sympy, поскольку оба выдают ошибку.
Тем не менее, эта полная интеграция, похоже, нигде не документирована.Это просто случайность того, как эти библиотеки реализованы, или это преднамеренная функция?Если последнее, когда оно предназначено для использования, и когда было бы лучше использовать sympy.Matrix
или другие решения?Могу ли я рассчитывать сохранить некоторую скорость numpy при работе с массивами такого типа, или она просто вернется к циклам Python, как только появится символ sympy?
Короче говоря, я рад найти этофункция существует, но я хотел бы узнать о ней больше!