scipy 函数总是返回一个 numpy 数组

2024-04-06

我遇到一个 scipy 函数,无论传递给它什么,它似乎都会返回一个 numpy 数组。在我的应用程序中,我需要能够仅传递标量和列表,因此唯一的“问题”是,当我将标量传递给函数时,返回一个包含一个元素的数组(当我期望标量时)。我应该忽略这种行为,还是修改该函数以确保在传递标量时返回标量?

示例代码:

#! /usr/bin/env python

import scipy
import scipy.optimize
from numpy import cos

# This a some function we want to compute the inverse of
def f(x):
    y = x + 2*cos(x)
    return y

# Given y, this returns x such that f(x)=y
def f_inverse(y):

    # This will be zero if f(x)=y
    def minimize_this(x):
        return y-f(x)

    # A guess for the solution is required
    x_guess = y
    x_optimized = scipy.optimize.fsolve(minimize_this, x_guess) # THE PROBLEM COMES FROM HERE
    return x_optimized

# If I call f_inverse with a list, a numpy array is returned
print f_inverse([1.0, 2.0, 3.0])
print type( f_inverse([1.0, 2.0, 3.0]) )

# If I call f_inverse with a tuple, a numpy array is returned
print f_inverse((1.0, 2.0, 3.0))
print type( f_inverse((1.0, 2.0, 3.0)) )

# If I call f_inverse with a scalar, a numpy array is returned
print f_inverse(1.0)
print type( f_inverse(1.0) )

# This is the behaviour I expected (scalar passed, scalar returned).
# Adding [0] on the return value is a hackey solution (then thing would break if a list were actually passed).
print f_inverse(1.0)[0] # <- bad solution
print type( f_inverse(1.0)[0] )

在我的系统上,其输出是:

[ 2.23872989  1.10914418  4.1187546 ]
<type 'numpy.ndarray'>
[ 2.23872989  1.10914418  4.1187546 ]
<type 'numpy.ndarray'>
[ 2.23872989]
<type 'numpy.ndarray'>
2.23872989209
<type 'numpy.float64'>

我正在使用 MacPorts 提供的 SciPy 0.10.1 和 Python 2.7.3。

SOLUTION

阅读下面的答案后,我决定采用以下解决方案。将返回线替换为f_inverse with:

if(type(y).__module__ == np.__name__):
    return x_optimized
else:
    return type(y)(x_optimized)

Here return type(y)(x_optimized)导致返回类型与调用函数的类型相同。不幸的是,如果 y 是 numpy 类型,这不起作用,所以if(type(y).__module__ == np.__name__)习惯于使用此处介绍的想法检测 numpy 类型 https://stackoverflow.com/questions/12569452/how-to-identify-numpy-types-in-python/12569453#12569453并将它们排除在类型转换之外。


执行的第一行scipy.optimize.fsolve is:

x0 = array(x0, ndmin=1)

这意味着您的标量将变成 1 元素序列,并且您的 1 元素序列本质上不会改变。

它似乎有效的事实是一个实现细节,我会重构您的代码以不允许将标量发送到fsolve。我知道这似乎与鸭子打字相悖,但该函数要求ndarray对于这个论点,所以你应该尊重接口对实现变化的鲁棒性。但是,我没有看到有条件地使用有任何问题x_guess = array(y, ndmin=1)用于将标量转换为ndarray在包装函数中,并在必要时将结果转换回标量。

这是文档字符串的相关部分fsolve功能:

def fsolve(func, x0, args=(), fprime=None, full_output=0,
           col_deriv=0, xtol=1.49012e-8, maxfev=0, band=None,
           epsfcn=0.0, factor=100, diag=None):
    """
    Find the roots of a function.

    Return the roots of the (non-linear) equations defined by
    ``func(x) = 0`` given a starting estimate.

    Parameters
    ----------
    func : callable f(x, *args)
        A function that takes at least one (possibly vector) argument.
    x0 : ndarray
        The starting estimate for the roots of ``func(x) = 0``.

    ----SNIP----

    Returns
    -------
    x : ndarray
        The solution (or the result of the last iteration for
        an unsuccessful call).

    ----SNIP----
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

scipy 函数总是返回一个 numpy 数组 的相关文章

随机推荐

  • 如何提取html注释和节点包含的所有html?

    我正在创建一个小型网络应用程序来帮助我管理和分析网站内容 而 cURL 是我最喜欢的新玩具 我已经弄清楚如何提取有关各种元素的信息 如何查找具有特定类的所有元素等 但我遇到了两个问题 见下文 我希望有一些漂亮的 xpath 答案 但如果我必
  • 如何将字符串中的元音更改为符号?

    我需要使用 C 将字符串中的元音更改为 我知道我需要使用 for 循环 并且我很确定我走在正确的轨道上 但我无法让它工作 这是我的代码 include
  • 用于计算拉力赛速度图的数据[重复]

    这个问题在这里已经有答案了 我正在开发一个项目 从拉力赛中提取数据并创建速度图表 我了解要使用的 REST Web 服务 API 是缺陷 迭代 分层需求和迭代累积流数据 但是您能否告诉我如何进行实际计算来计算特定项目的每次迭代速度 需要什么
  • 使用 Clang AST 打印函数的参数

    我想将参数传递给函数 例如 如果我接到电话 printf d d i j 输出应该是 d dij 我可以使用 RecursiveASTVisitor 中的 VisitCallExpr 进行函数调用 还能够获取参数数量和参数类型 但我不知道如
  • 使用 jQuery ajax 响应数据

    我正在使用 ajax post 并接收 html 形式的数据 我需要拆分数据并将数据片段放置在整个页面上 我将响应数据构建为类似的 p Hello there and Welcome p p First timer visiting our
  • Uploadify 在 Chrome 10 中突然完全停止工作

    我正在使用 Uploadify 来允许在我的网络应用程序中上传多个文件 它始终适用于 IE 7 8 9 FF 3 6 Safari 和 Chrome 今天我偶然发现它在每个浏览器中都可以工作 但在 Chrome 中却不行 我目前使用的是 C
  • 是否可以隐藏弹性图表的轴并且使其不占用任何空间?

    是否可以告诉 flex 显示没有可见轴的图表 我希望图表的内容占据所有可用空间 我可以将 AxisRenderer 上的可见性设置为 false 这将隐藏轴 但会在轴通常所在的位置留下一个空白空间 我怎样才能删除这个空白区域
  • 在 .NET Core 中的 Web 请求中使用 NTLM 身份验证

    Update事实证明 我所需要做的就是升级到 NET Core 2 1 感谢大家的解决方案 我有一个 NET Core 2 0 控制台应用程序 需要向使用 Windows 身份验证 特别是 NTLM 的 API 发出 Web 请求 这是我公
  • 如何在jpa监听器中获取实体管理器或事务

    我正在使用 Hibernate 事件侦听器 例如PostDeleteEventListener PostInsertEventListener PostUpdateEventListener在插入 删除和更新期间执行一些操作 现在我想使用
  • 变基时如何处理与给定策略的特定合并冲突?

    假设我正在执行交互式 git rebase 以整理我的存储库 例如重新排列 分离或压缩提交 git rebase i HEAD 100 还说我预计会遇到许多合并冲突 其中所需的行为是像传递一样解决 s recursive X theirs
  • 有什么方法可以显示正在运行的 JVM 中使用的标志吗?

    尽管我们已经为应用程序显式设置了许多 JVM 标志 但很难知道是否 1 布尔标志默认已打开 默认值在 JDK JRE 次要更新之间发生了变化 2 一个标志否定另一个标志 3 特定系统上给定任意标志的默认值是什么 由 Java 人体工程学设置
  • 与从 IDE 构建/运行相比,iOS 14 不允许 Flutter 应用程序(仍在开发中)从主屏幕启动

    I ve been developing a news app with Flutter and when I build and run it through Android Studio it launches fine but whe
  • Google Storage 的 CORS 策略允许来自我的来源,但不存在“Access-Control-Allow-Origin”标头

    我是 CORS 配置的新手 并试图弄清楚这一点 但根据文档 我的设置看起来是正确的 我希望你能帮我看看我错过了什么 我的代码正在尝试上传 PUT 使用签名 URL 直接将文件保存到 Google 存储 访问 XMLHttpRequest 从
  • Azure Functions:为根 URL 提供内容

    我有一个 C Azure Function 项目 具有多种功能 其中一项功能是提供一些 HTML 内容 目前可以在 api home 访问该功能 但是 我希望针对根 URL 触发它 我在我的项目中添加了一个 proxies json 文件
  • 访问 PDF.js 查看器功能/事件

    我正在考虑建立一个小网站 读取一些 PDF 文件并将它们加载到PDF js 查看器 https github com mozilla pdf js tree master web 我想专门使用查看器 我仍然希望显示所有查看器 UI 和功能
  • Excel 告诉我我的空白单元格不是空白

    我试图通过使用 F5 查找空白单元格 然后按 Ctrl 删除它们 然后将单元格向上移动 从而删除包含信息的单元格之间的空白单元格 但是当我尝试这样做时 它告诉我 没有找到细胞 I ve noticed that if I select my
  • 将文本插入另一个应用程序的文本框中

    如何使用 C 或 C 将文本插入另一个应用程序的文本框中 我很久以前就这样做过 似乎还记得一些有关使用应用程序 HWND 的事情 但由于应用程序的每个实例都发生了变化 我觉得我不记得完整的故事了 我是否可以以某种方式获取正在运行的应用程序的
  • Flexbox:将元素居中于屏幕中间

    如果我要将一个元素置于屏幕中间flexbox 以下方法是最优雅的吗 HTML div class btn div CSS body overflow hidden position absolute width 100 height 100
  • C# 创建包含数字和字符的字符串序列

    我正在尝试创建一个数字序列 in string格式 一旦我到达 99999 我想使用继续序列前导字母 Example 00000 gt 00100 gt 99999 gt A0001 gt A9999 gt B0001 gt ZZZZZ 有
  • scipy 函数总是返回一个 numpy 数组

    我遇到一个 scipy 函数 无论传递给它什么 它似乎都会返回一个 numpy 数组 在我的应用程序中 我需要能够仅传递标量和列表 因此唯一的 问题 是 当我将标量传递给函数时 返回一个包含一个元素的数组 当我期望标量时 我应该忽略这种行为