use*_*386 12 python arrays numpy elementwise-operations
我有两个相同形状的输入数组x和y.我需要通过函数运行匹配索引的每个元素,然后将结果存储在第三个数组z中的那些索引处.完成此任务的最pythonic方法是什么?现在我有四个循环 - 我确信有一个更简单的方法.
x = [[2, 2, 2],
[2, 2, 2],
[2, 2, 2]]
y = [[3, 3, 3],
[3, 3, 3],
[3, 3, 1]]
def elementwise_function(element_1,element_2):
return (element_1 + element_2)
z = [[5, 5, 5],
[5, 5, 5],
[5, 5, 3]]
Run Code Online (Sandbox Code Playgroud)
我感到困惑,因为我的函数只适用于单个数据对.我不能简单地将x和y数组传递给函数.
ill*_*lya 15
一种"更简单的方法"是使用创建NumPy感知功能numpy.vectorize."ufunc"是元素函数的NumPy术语(参见此处的文档).使用numpy.vectorize允许你使用逐个元素的函数创建自己的ufunc,其工作方式与其他NumPy ufuncs相同(如标准添加等):ufunc将接受数组并将它的函数应用于每对元素,它将像标准的NumPy函数一样进行数组形状广播等.文档页面有一些可能有用的用法示例.
(我猜你在谈论简单的python list,不是numpy.array)
递归总让我们的生活更轻松:
def operate_on_Narray(A, B, function):
try:
return [operate_on_Narray(a, b, function) for a, b in zip(A, B)]
except TypeError as e:
# Not iterable
return function(A, B)
Run Code Online (Sandbox Code Playgroud)
用法:
>>> x = [[2, 2, 2],
... [2, 2, 2],
... [2, 2, 2]]
>>>
>>> y = [[3, 3, 3],
... [3, 3, 3],
... [3, 3, 1]]
>>> operate_on_Narray(x, y, lambda a, b: a+b)
[[5, 5, 5], [5, 5, 5], [5, 5, 3]]
Run Code Online (Sandbox Code Playgroud)
它可以在任何其他类型的维数组中工作:
>>> operate_on_Narray([1, 2, 3], [4, 5, 6], lambda a, b: a*b)
[4, 10, 18]
Run Code Online (Sandbox Code Playgroud)