RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1528497
Accepted
Alex_Kazantsev
Alex_Kazantsev
Asked:2023-07-02 17:07:31 +0000 UTC2023-07-02 17:07:31 +0000 UTC 2023-07-02 17:07:31 +0000 UTC

为什么 Python 函数不返回预期的 Pandas 列表示形式?

  • 772

我使用二分法计算方程中求根的函数dichotomy(),然后使用装饰器显示值print_dichotomy()。我相信最后我会看到列根 - 函数在根 - 误差 - 收敛处的值。然而,实际上,我以这样的方式得到它:只有函数的根和值预期从 columns 中显示,而其他两列是不正确的。其中,误差仅由一个值(其余行NaN)表示,并且收敛- 它的所有值都在一行中。

我没有描述该函数的本质dichotomy(),而是在其中放置 Pandas 列的伪值列表。

错误在哪里?

我的代码:

import numpy as np
import pandas as pd

def print_dichotomy(funcs):
    def wrapper(a, b, eps_func, eps_arg):
        *res, func, eps_list, prev_roots = list(funcs(a, b, eps_func, eps_arg))
        func = list(map(lambda x: f'{f(x):.10f}', res))
        result_table = pd.DataFrame()
        result_table['Корни'] = pd.Series(res)
        result_table['Значения функции'] = pd.Series(func)
        result_table['Погрешность расчета'] = pd.Series(eps_list)
        result_table['Сходимость'] = pd.Series(prev_roots)
        print(result_table)
    return wrapper

def f(x):
    return 1.2 - np.log(x) - 4 * np.cos(2 * x)

@print_dichotomy
def dichotomy(a, b, eps_func, eps_arg):

    # 1. создаем переменную-список для хранения значений корня
    prev_roots = [0.01, 0.01, 0.01, 0.01, 0.01, 0.01]
    # 2. создадим список для хранения погрешностей расчета
    eps_list = [0.02, 0.02, 0.02, 0.02, 0.02, 0.02]
    # 3. создадим список для хранения корней
    roots = [0.03, 0.03, 0.03, 0.03, 0.03, 0.03]
    for i in roots:
        root = i 
        # 4. возвращаем корень
        if root:
            yield root
      
    # 5. возвращаем значение погрешности расчета корня, сходимости 
    yield eps_list, prev_roots

dichotomy(0.0001, 50, 0.000001, 0.000001)
python
  • 2 2 个回答
  • 39 Views

2 个回答

  • Voted
  1. Best Answer
    Алексей Р
    2023-07-03T19:00:33Z2023-07-03T19:00:33Z

    该错误在于函数之间数据传输和接收不正确。

    1. 从dichotomy()你那里返回yield eps_list, prev_roots,这相当于yield (eps_list, prev_roots),即 两个列表的元组。您稍后会在框架中看到这些列表作为值。并且,由于这些列表没有“解压”到框架单元中,因此其余值变成了 NaN。
    2. 在wrapper()表达式中,*res, func, eps_list, prev_roots = list(funcs(a, b, eps_func, eps_arg))您将生成器函数返回的值dichotomy()放入变量中。从最后开始:
    • prev_roots上述元组被传递到(eps_list, prev_roots)并填充“Convergence”列的前2行(下面没有数据,因此为NaN);
    • eps_list列表中的最后一个(第六个)值输入- roots0.03,它也成为该列第一行的值Погрешность расчета;
    • func列表中的倒数第二个(第五个)值输入- roots0.03,但未在其他任何地方使用(消失);
    • 列表中剩余的 4 个第一个值roots将传递给变量res并显示在该列的四行中Корни。

    因此,结果是一帧 4 行,而不是预期的 6 行,并且其中的数据位置不正确。

    在没有深入研究所选方法的原因并且没有消除代码冗余(例如,转换)的情况下,我对代码进行了最低程度的纠正,以便(我希望)发出所需的输出list():pd.Series()

    def print_dichotomy(funcs):
        def wrapper(a, b, eps_func, eps_arg):
            *res, eps_list, prev_roots = list(funcs(a, b, eps_func, eps_arg))
            func = list(map(lambda x: f'{f(x):.10f}', res))
            result_table = pd.DataFrame()
            result_table['Корни'] = pd.Series(res)
            result_table['Значения функции'] = pd.Series(func)
            result_table['Погрешность расчета'] = pd.Series(eps_list)
            result_table['Сходимость'] = pd.Series(prev_roots)
            print(result_table)
    
        return wrapper
    
    
    def f(x):
        return 1.2 - np.log(x) - 4 * np.cos(2 * x)
    
    
    @print_dichotomy
    def dichotomy(a, b, eps_func, eps_arg):
        # 1. создаем переменную-список для хранения значений корня
        prev_roots = [0.011, 0.012, 0.013, 0.014, 0.015, 0.016]
        # 2. создадим список для хранения погрешностей расчета
        eps_list = [0.021, 0.022, 0.023, 0.024, 0.025, 0.026]
        # 3. создадим список для хранения корней
        roots = [0.03, 0.03, 0.03, 0.03, 0.03, 0.03]
        for i in roots:
            root = i
            # 4. возвращаем корень
            if root:
                yield i
    
        # 5. возвращаем значение погрешности расчета корня, сходимости
        yield eps_list
        yield prev_roots
    
    
    
    dichotomy(0.0001, 50, 0.000001, 0.000001)
    

    结论:

       Корни Значения функции  Погрешность расчета  Сходимость
    0   0.03     0.7137557376                0.021       0.011
    1   0.03     0.7137557376                0.022       0.012
    2   0.03     0.7137557376                0.023       0.013
    3   0.03     0.7137557376                0.024       0.014
    4   0.03     0.7137557376                0.025       0.015
    5   0.03     0.7137557376                0.026       0.016
    

    发生了什么变化:

    • *res, func, eps_list, prev_roots = list(funcs(a, b, eps_func, eps_arg))删除 ,func以便结果的最后一行不会被吃掉;
    • yield eps_list, prev_roots分成两行,否则元组返回到一个变量中,但需要将两个列表分成两部分;
    • prev_roots为了清晰起见,测试值多样化eps_list​​​​。
    • 2
  2. Alinur
    2023-07-02T17:57:25Z2023-07-02T17:57:25Z
    import pandas as pd
    
    def print_dichotomy(funcs):
        def wrapper(a, b, eps_func, eps_arg):
            *res, func, eps_list, prev_roots = list(funcs(a, b, eps_func, eps_arg))
            func = list(map(lambda x: f'{func(x):.10f}', res))  # Исправлено f(x) на func(x)
            result_table = pd.DataFrame()
            result_table['Корни'] = pd.Series(res)
            result_table['Значения функции'] = pd.Series(func)
            result_table['Погрешность расчета'] = pd.Series(eps_list)
            result_table['Сходимость'] = pd.Series(prev_roots)
            print(result_table)
        return wrapper
    
    def f(x):
        return 1.2 - np.log(x) - 4 * np.cos(2 * x)
    
    @print_dichotomy
    def dichotomy(a, b, eps_func, eps_arg):
    
        # 1. создаем переменную-список для хранения значений корня
        prev_roots = [0.01, 0.01, 0.01, 0.01, 0.01, 0.01]
        # 2. создадим список для хранения погрешностей расчета
        eps_list = [0.02, 0.02, 0.02, 0.02, 0.02, 0.02]
        # 3. создадим список для хранения корней
        roots = [0.03, 0.03, 0.03, 0.03, 0.03, 0.03]
        for i in roots:
            root = i 
            # 4. возвращаем корень
            if root:
                yield root
          
        # 5. возвращаем значение погрешности расчета корня, сходимости 
        yield eps_list, prev_roots
    
    dichotomy(0.0001, 50, 0.000001, 0.000001)```
    
    • 0

相关问题

  • 是否可以以某种方式自定义 QTabWidget?

  • telebot.anihelper.ApiException 错误

  • Python。检查一个数字是否是 3 的幂。输出 无

  • 解析多个响应

  • 交换两个数组的元素,以便它们的新内容也反转

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5