在Python中使用地图

3

我正在尝试弄清楚如何正确使用Python中的map函数,以便我可以通过Pool.map实现多线程程序。基本上,我遇到了理解Python函数式编程的问题。我有:

import numpy as np

def maptest(foo,bars):
   print foo * bars

main():
   matA = np.eye(2)
   matB = np.eye(2)

   print map((lambda foo: maptest(foo, matB)), matA) 

这将给我一个输出:
[[ 1.  0.]
 [ 0.  0.]]
[[ 0.  0.]
 [ 0.  1.]]
[None, None]

当我需要的输出仅为:
[[1. 0.]
 [0. 1.]]

我该如何使用map和lambda函数?这是我第一次使用map和lambda。我之前只用过sympy的lambdify,但那只是我的函数式编程经验的一部分。谢谢!

1个回答

5
[None, None]来自于打印地图调用(请注意,您的maptest函数会打印!)。
现在,打印多个数组的原因是您正在将函数映射到mapA的所有元素上。 mapA实际上是一个两个元素的数组,并且map将您的函数应用于每个数组元素。 因此,您会先打印[1,0][[1,0][0,1]],然后再打印[0,1][[1,0][0,1]]。 您并没有对矩阵进行乘法运算,而是对mapA的每个元素分别进行了两次乘法运算。

现在这个问题有意义多了,谢谢!我已经删除了打印语句,所以 [None,None] 不会再显示出来了,但是我该如何修改 map 调用以正常执行乘法,而不是将 matA 的每个元素相乘? - bynx
1
您需要将 matA 包装在另一个可迭代对象中。例如,一个只含有一个元素的元组:map((lambda foo: maptest(foo, matB)), (matA,)) 或者列表 [matA] - sebastian
@sebastian 啊!现在如果我包装matA,它就可以工作了!但是现在如果我改变matA,比如说改成[[0,1],[1,0]],我得到的解决方案是[[0,1],[1,0]],而应该是[[0,0],[0,0]]。现在怎么回事? - bynx
不,那是正确的。单位矩阵乘以任何第二个矩阵都等于那个第二个矩阵。 - gregkow
你完全正确。这是晚上发布的,所以我只是有点傻 —— 真的只是需要睡觉。谢谢! - bynx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接