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函数不接受数组作为输入的主要内容,如果未能解决你的问题,请参考以下文章

Python。重复元素判定。编写一个函数,接受列表作为参数

Python封装一个函数接受文件夹的名称作为输入参数,打印该文件夹中的的全部路程信息(遍历路径)

python3.4控制用户输入与输出

python,函数式编程

python 3 输入和输出

Python之内置函数