【问题标题】:How to quickly calculate the sympy symol within the data frame如何快速计算数据框内的sympy symol
【发布时间】:2022-11-23 13:52:44
【问题描述】:

我在 python 中使用 pandas、numpy、sympy 库。 有没有办法更快地计算下面的语句?

import pandas as pd
import numpy as np
import sympy as sp

df = pd.DataFrame(np.zeros(100 ** 2).reshape(100,100))
x = sp.symbols('x',real = True)
df.loc[99,99] = x

for j in range(99,0,-1):
   for k in range(j-1,-1,-1):
      df.loc[k,j] = df.loc[k+1,j] ** (1/2) * sp.exp(1.5)
      df.loc[j-1,j-1] = df.loc[0,j] 

我使用线程、多处理、numba 库来提高速度。 但是总是出现Error。

【问题讨论】:

  • 虽然 df 开始填充浮点零,但通过插入一个 sympy symbol,您将框架(或至少某些列)的数据类型更改为对象数据类型。现在你已经失去了编译 numpy 方法的所有速度优势。我预计 numba 也有这方面的问题。我们不建议混合使用 sympy 和 numpy - 除非你知道你在做什么!
  • 谢谢你。但我应该使用 sympy 符号。因此,如果我将 sympy 和 numpy 混合使用,我将无法提高计算速度。这样对吗?如果你知道另一个 sovle,请教我。
  • 有没有办法在 numpy 中使用“x”符号?
  • 我不明白你想做什么。 numpy 用于数值计算,尤其是大型数组。 sympy 是象征性的,想想代数。如果不进行一些研究,您将无法有效地使用它们。

标签: python pandas numpy sympy


【解决方案1】:

让我们运行您的代码,但使用合理的大小 4(而不是 100):

In [7]: df = pd.DataFrame(np.zeros(4 ** 2).reshape(4,4))
   ...: x = sp.symbols('x',real = True)
   ...: df.loc[3,3] = x
   ...: 
   ...: for j in range(3,0,-1):
   ...:    for k in range(j-1,-1,-1):
   ...:       df.loc[k,j] = df.loc[k+1,j] ** (1/2) * sp.exp(1.5)
   ...:       df.loc[j-1,j-1] = df.loc[0,j]
   ...:       

In [8]: df
Out[8]: 
                              0                             1  
0  19.1657532216759*x**0.015625  19.1657532216759*x**0.015625   
1                           0.0   18.2880894824436*x**0.03125   
2                           0.0                           0.0   
3                           0.0                           0.0   

                             2                          3  
0  18.2880894824436*x**0.03125  13.8045741860671*x**0.125  
1   16.6514949636101*x**0.0625   9.48773583635853*x**0.25  
2    13.8045741860671*x**0.125    4.48168907033806*x**0.5  
3                          0.0                          x  

In [9]: df.dtypes
Out[9]: 
0    object
1    object
2    object
3    object
dtype: object

正如我评论的那样,这是一个对象 dtype 框架。

作为一个 numpy 数组:

In [10]: df.to_numpy()
Out[10]: 
array([[19.1657532216759*x**0.015625, 19.1657532216759*x**0.015625,
        18.2880894824436*x**0.03125, 13.8045741860671*x**0.125],
       [0.0, 18.2880894824436*x**0.03125, 16.6514949636101*x**0.0625,
        9.48773583635853*x**0.25],
       [0.0, 0.0, 13.8045741860671*x**0.125, 4.48168907033806*x**0.5],
       [0.0, 0.0, 0.0, x]], dtype=object)

直接使用数组而不是 pandas 会更简单(并且可能更快):

In [11]: arr = np.zeros((4,4),object)
    ...: x = sp.symbols('x',real = True)
    ...: arr[3,3] = x
    ...: 
    ...: for j in range(3,0,-1):
    ...:    for k in range(j-1,-1,-1):
    ...:       arr[k,j] = arr[k+1,j] ** (1/2) * sp.exp(1.5)
    ...:       arr[j-1,j-1] = arr[0,j]

但我不知道这个数组的价值是什么。您不能将任何 sympy 函数/方法应用于 numpy 数组(例如,没有 subs)。你可以用数组做一些基本的数学运算,只要x实现它,比如 2arr, or arr+arr. Even arr@arr.T, which ends up using the +and properties ofx`。但所有这些都以迭代 Python 速度(如列表)完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-23
    • 1970-01-01
    • 2011-08-31
    • 2016-02-21
    • 1970-01-01
    • 1970-01-01
    • 2017-10-31
    • 2019-02-10
    相关资源
    最近更新 更多