Python 数组元素操作

Python 数组元素操作,python,arrays,numpy,elementwise-operations,Python,Arrays,Numpy,Elementwise Operations,我有两个相同形状的输入数组x和y。我需要通过一个函数使用匹配的索引运行它们的每个元素,然后将结果存储在第三个数组z中的这些索引处。实现这一目标的最具Python风格的方式是什么?现在我有四个循环-我相信有一个更简单的方法 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,elemen

我有两个相同形状的输入数组x和y。我需要通过一个函数使用匹配的索引运行它们的每个元素,然后将结果存储在第三个数组z中的这些索引处。实现这一目标的最具Python风格的方式是什么?现在我有四个循环-我相信有一个更简单的方法

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]]
我感到困惑,因为我的函数只能处理单个数据对。我不能简单地将x和y数组传递给函数。

一个“更简单的方法”是使用创建一个NumPy感知函数。“ufunc”是一个元素级函数的基本术语(参见文档)。使用
numpy.vectorize
可以使用逐元素函数创建自己的ufunc,其工作方式与其他numpy ufunc(如标准加法等)相同:ufunc将接受数组,并将您的函数应用于每对元素,它将像标准numpy函数一样进行数组形状广播,等等。有一些可能有用的用法示例

In [1]: import numpy as np
   ...: def myfunc(a, b):
   ...:     "Return 1 if a>b, otherwise return 0"
   ...:     if a > b:
   ...:         return 1
   ...:     else:
   ...:         return 0
   ...: vfunc = np.vectorize(myfunc)
   ...: 

In [2]: vfunc([1, 2, 3, 4], [4, 3, 2, 1])
   ...: 
Out[2]: array([0, 0, 1, 1])
In [3]: vfunc([1, 2, 3, 4], 2)
   ...: 
Out[3]: array([0, 0, 1, 1])
(我猜你说的是简单的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)
用法:

>>> 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]]
它将在任何其他类型的维度数组中工作:

>>> operate_on_Narray([1, 2, 3], [4, 5, 6], lambda a, b: a*b)
[4, 10, 18]

以下来自python 2.7.3解释器会话的文本演示了如何使用内置函数
map
将元素操作应用于2D矩阵元素。(注意:
运算符.add
相当于所述的
elementwise_函数
,也相当于第二次使用
applier
时的lambda表达式)

注意,上面的x,y如下所示:

x=[[2, 2, 1], [2, 2, 2], [3, 2, 2]]
y=[[3, 3, 1], [3, 2, 3], [3, 3, 3]]
如前所述,上面的文本来自python 2.7.3解释器会话。如果此代码在Python3中运行,它将返回映射对象。可以使用如下函数查看数字:

def itemize(m):
    return [itemize(e) for e in m] if hasattr(m, '__iter__') else m
有了这个函数,语句

itemize(applier(x, y, operator.add))
返回

[[5, 5, 2], [5, 4, 5], [6, 5, 5]]

默认情况下,numpy数组是按元素排列的。也就是说,x+y=zi是否有希望在矩阵级别执行该操作?例如,
z=x+y
在上面的示例中起作用。也许你可以告诉我们你的函数是什么,我们可以帮助你在矩阵上工作?这个方法返回“@onurcanbektas”,这是Python3对2的结果。更多信息请参见编辑,当然,请点击编辑!
[[5, 5, 2], [5, 4, 5], [6, 5, 5]]