Python函数不接受数组作为输入
Posted
技术标签:
【中文标题】Python函数不接受数组作为输入【英文标题】:Python function not accepting arrays as inputs 【发布时间】: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]
?我认为你并没有真正做到这一点。
【参考方案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。
【讨论】:
以上是关于Python函数不接受数组作为输入的主要内容,如果未能解决你的问题,请参考以下文章