[英]Python lambda application ambiguity on multi-dimensional arrays
给定下面的代码示例,一个产生预期结果,另一个给出错误。 对于初学者(即我)来说似乎很困惑。 我假设算术运算是明智的,但其他人则不然。 什么是“好的”(即有效的)概括方法来简单地对多维数组的元素执行操作,而无需了解数组行为的一些基本知识?
import numpy as np
data = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
print(data)
my_function = lambda x: x*2+5
result = my_function(data)
print(result)
输出:[[1 2 3 4] [5 6 7 8]] [[ 7 9 11 13] [15 17 19 21]]
import numpy as np
data = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
print(data)
my_function = lambda x: x if x < 3 else 0
result = my_function(data)
print(result)
ValueError:具有多个元素的数组的真值不明确。 使用 a.any() 或 a.all()
编辑:我不是在寻找特定的解决方案。 是的,对于这个确切的示例,我可以使用 np.where 或其他一些机制。 我特别询问 lambdas 以及它们的使用对用户来说似乎模棱两可。 如果有帮助,lamba / 过滤器来自命令行/模块外部。 因此,它可以是用户想要将原始数组转换为的任何东西——简单的正方形元素,或者调用 API,然后使用它的输出来确定替换值。 你明白了。
运行 python 3.9.13
这是有效的,因为像*
和+
这样的运算符对 numpy 数组按元素工作:
In [101]: data = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
...: print(data)
...:
...: my_function = lambda x: x*2+5
...:
...: result = my_function(data)
[[1 2 3 4]
[5 6 7 8]]
my_function = lambda x: x if x < 3 else 0
失败,因为if x<3
本质上是一个标量操作。 if/else
不迭代; 它需要一个简单的 True/False 值
In [103]: data<3
Out[103]:
array([[ True, True, False, False],
[False, False, False, False]])
np.vectorize
是将数组(或数组)元素应用于标量函数的最通用工具:
In [104]: f = np.vectorize(my_function, otypes=[int])
In [105]: f(data)
Out[105]:
array([[1, 2, 0, 0],
[0, 0, 0, 0]])
我包含了otypes
参数以避免 SO 询问的更常见的vectorize
错误之一。
np.vectorize
在小情况下比普通迭代慢,但在大情况下变得有竞争力。 但它的主要优点是它更易于用于多维数组。 当函数需要多个输入并且您想利用广播时,情况会更好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.