【问题标题】:How to use arrays/vectors in a Python user-defined function?如何在 Python 用户定义函数中使用数组/向量?
【发布时间】:2018-03-17 06:22:27
【问题描述】:

我正在构建一个函数来计算给定组件/子系统的可靠性。为此,我在脚本中编写了以下内容:

import math as m
import numpy as np

def Reliability (MTBF,time):
  failure_param = pow(MTBF,-1)
  R = m.exp(-failure_param*time)
  return R

该函数适用于我在函数中调用的任何 时间 值。现在我想调用函数来计算给定数组的可靠性,比如说 np.linspace(0,24,25)。但随后我收到类似“类型错误:只有长度为 1 的数组可以转换为 Python 标量”之类的错误。

谁能帮助我在这样的 Python 函数上传递数组/向量?

非常感谢您。

【问题讨论】:

  • 签出np.vectorize
  • 使用 NumPy 函数 - 将 m. 替换为 np.

标签: python arrays function numpy


【解决方案1】:

您使用的math.exp() 函数对 numpy 一无所知。它需要一个标量,或者只有一个元素的可迭代,它可以将其视为标量。请改用 numpy.exp(),它接受 numpy 数组。

【讨论】:

  • 非常感谢。非常感谢您的提示!我过去一直在使用 Matlab,现在正在迁移到 Python。我很惊讶 Python 的强大和社区丰富。
【解决方案2】:

为了能够使用 numpy 数组,您需要使用 numpy 函数:

import numpy as np

def Reliability (MTBF,time):
    return np.exp(-(MTBF ** -1) * time)

【讨论】:

  • 非常感谢您的提示!我现在就换
【解决方案3】:

如果可能,在使用 numpy 对象时,您应该始终使用 numpy 函数而不是 math 函数。

它们不仅直接在数组和矩阵等 numpy 对象上工作,而且还经过高度优化,即使用 CPU 的矢量化功能(如 SSE)。像 exp/sin/cos/pow 这样的大多数函数都可以在 numpy 模块中使用。在 scipy 中可以找到一些更高级的功能。

【讨论】:

  • 非常感谢您的提示!我现在会在需要时开始使用 numpy ans scipy 函数 :)
【解决方案4】:

不是在向量上调用 Reliability,而是在每个元素上使用列表推导来调用它:

[Reliability(MTBF, test_time) for test_time in np.linspace(0,24,25)]

或者:

map(Reliability, zip([MTBF]*25, linspace(0,24,25))

第二个生成一个生成器对象,如果列表的大小开始变大,它可能会更好地提高性能。

【讨论】:

  • 没有。使用 python 循环(是的,甚至是列表推导)比应用于向量的 numpy/scipy 方法慢得多。
  • 如果您使用的是 numpy,您仍然应该始终使用 numpy 函数。您的函数也将向量转换为列表。
  • Nitpick,map 不会生成生成器
猜你喜欢
  • 2020-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-19
  • 1970-01-01
  • 2022-11-02
  • 2018-11-18
  • 1970-01-01
相关资源
最近更新 更多