【问题标题】:Python function not accepting arrays as inputsPython函数不接受数组作为输入
【发布时间】:2022-01-15 23:43:57
【问题描述】:

此函数适用于示例 1 中所示的单个输入,但是当我想使用数组作为输入来运行它时,它会失败(如示例 2 中所述)。我不想使用 for 循环来计算 d、l 和 b 数组的每个元素的函数。因为它很慢。我想要做的是该函数必须使用 d、l 和 b 的每个数组的第 i 个元素作为输入并计算结果并将结果作为具有相同大小 d、l 和湾。在示例 2 中,结果应该是一个 2 元素数组,即 array([17.8, 22.4])。但它并没有像我预期的那样工作。

import numpy as np

def mydef(d, l, b):
    dd = 0.1
    ds = np.arange(0, d+dd, dd)
    return np.sum(l*ds+b)

#Example 1
print(mydef(.2, 3, 4))
print(mydef(.3, 4, 5))
#Example 2
d=np.array([.2, .3])
l=np.array([3, 4])
b=np.array([4, 5])
print(mydef(d, l, b))

示例 2 给出

ValueError:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()

【问题讨论】:

  • 回溯应该显示错误在arange 中。该函数仅适用于标量。查看其文档!你有没有测试过更简单的np.arange(0, d)
  • 你期望ds 是什么?
  • @hpaulj 不,它不工作。这就像使用 dd 的步长对 (0, d) 范围内的函数进行积分一样。但我做不到。
  • for d = 0.2, ds = [0, 0.1, 0.2]
  • 对于 0.3?对于[.2, .3]?我认为你并没有真正做到这一点。

标签: python function numpy loops definition


【解决方案1】:

虽然我同意 hpaulj,但以下内容可以帮助您:

import numpy as np

def mydef(d, l, b):
    dd = 0.1
    ds = np.arange(0, d+dd, dd)
    return np.sum(l*ds+b)

vfunc = np.vectorize(mydef)

dd = 0.3
d=np.array([.2, .3])
l=np.array([3, 4])
b=np.array([4, 5])

output = vfunc(d, l, b)
output
array([17.8, 22.4])

请注意,提供 np.vectorize 主要是为了方便,而不是为了性能。另见numpy.vectorize: Why so slow?https://numpy.org/doc/stable/reference/generated/numpy.vectorize.html。 如果你真的想要纯粹的速度,那么你应该关注 hpaulj。

【讨论】:

    猜你喜欢
    • 2020-04-12
    • 2020-06-25
    • 2015-08-02
    • 1970-01-01
    • 1970-01-01
    • 2021-08-07
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多