我有一个多值函数,我想和np. linspace一起使用。每当函数中有if/else条件时,我都会得到一个值错误。
我期望将函数f应用于np.linspace类似于以下MWE中的Map:
def f(n):
if n < 3 or n > 5:
return 0
else:
return n
a = list(range(0, 11))
print(a)
print(list(map(f, a)))
b = np.linspace(0, 10, 11)
print(b)
print(f(b))
字符串
这对于常规列表很有效,但对于np.linspace则会失败,错误为
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
型
看来我弄错了,np.linspace出于某种原因想要检查数组中的每个元素是否满足条件。我不想使用any()或all(),因为那不是我想要做的。什么是最好的方法?
3条答案
按热度按时间ygya80vv1#
你需要使用一个面具,例如:
字符串
shstlldc2#
有多种方法可以以矢量化的方式完成此任务:
使用
np.where
字符串
使用乘法:
型
oprakyz73#
你的函数是用单个数字编写的,将
n
与3或5进行比较:字符串
Python有许多
generators
,它们设置了一个计算或迭代,但实际上并不执行它。你必须把它们 Package 在list
(或一些for
循环)中来填充它们:型
你不能给予你的函数一个列表:
型
换句话说,
[1,2,3,4]<3
不工作。map
是另一个generator
,它需要列表:型
生成器可以串在一起,而无需将每个中间步骤转换为列表:
型
numpy
numpy
有像linspace
和arange
这样的生成numpy数组的函数。它没有“生成器”。型
这个数组可以变成一个列表:
型
并通过列表/Map:
型
事实上,数组元素可以“Map”到你的函数:
型
但是你发现你的函数不能在数组上工作。这是一个不同于列表的错误。
数组可以与一个数字进行比较:
型
事实上,大多数数学运算符都可以使用数组-加法,等式,幂等。这是数组优于列表的一大好处。
但是
if
表达式(和or
)需要一个true/false,而不是[149]中的数组。这就是为什么你会得到模糊性错误。可以组合布尔测试(()很重要):
型
和其他显示可以作为一个多值掩码像你的
f
工作。np.where
是一个方便的工具,但不是唯一的一个。型
Numpy数组确实有一种“map”迭代,但它内置在数组方法和运算符中。大多数情况下,它是在编译代码中,并且相对较快,特别是对于大型数组。但是有一个显著的学习曲线。你不能有效地将数组替换为列表,或者期望数组像你的
map(f...)
一样行为。