python:避免嵌套for循环
例如,如何避免在下面的代码中嵌套for循环并使用map函数python:避免嵌套for循环,python,python-3.x,for-loop,map-function,Python,Python 3.x,For Loop,Map Function,例如,如何避免在下面的代码中嵌套for循环并使用map函数 import numpy as np A = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]]) n = len(A[0]) B = np.zeros((n,n)) for i in range(n): for j in range(n): B[j,i] = min(A[:,i]/A[:,j]) 我认为map()不是解决这个问题的好方法,因为您想要的结果是嵌套的,而
import numpy as np
A = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
n = len(A[0])
B = np.zeros((n,n))
for i in range(n):
for j in range(n):
B[j,i] = min(A[:,i]/A[:,j])
我认为map()
不是解决这个问题的好方法,因为您想要的结果是嵌套的,而不是扁平的。这比仅仅使用列表理解来达到你想要的结果要详细一点。这里有一种更简洁的初始化B
的方法
B = np.array([np.min(A.T/r, axis=1) for r in A.T])
这将迭代A
的每一列(A.T的每一行),并计算广播分区A.T/r
。Numpy能够优化这一点,远远超出了我们对原始循环所能做的。然后使用np.min()
计算矩阵的最小值,我们只是沿着每行(行而不是列,因为参数axis=1
)计算矩阵的最小值,比使用内置min()
计算矩阵的最小值要快,因为内部向量化
如果您确实想映射某些内容,@MartijnPieters指出,您可以将itertools与itertools.product(范围(len(A[0])),repeat=2)
一起使用,以获得相同的索引对。否则,您可以使用生成器((r,s)表示A.T中的r表示A.T中的s)
来获取行对,而不是索引对。在这两种情况下,您都可以在该iterable中应用map()
,但您仍然必须以某种方式嵌套结果,以正确初始化B
注意:这可能不是您预期的结果。A
的元素默认为整数(请注意,您使用了3
而不是3.
)。当您将A
的整数元素除以时,将再次得到整数。在您的代码中,np.zeros()
将这些整数强制转换为浮点数,这一事实部分地混淆了这一点,但无论如何,数学是错误的。要解决此问题,请在构造A
时传递一个附加参数:
A = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]], float)
map
仍然是一个内置的工具,对于许多用例来说都是一个非常好的工具,并且肯定不会主动阻止,除非您正在构建一个列表对象,而列表理解可能会更有意义。map
仍然在全局名称空间中。在Python 3中将reduce
移动到functools
。您似乎对reduce
的map
感到困惑,它确实从内置名称空间移到了functools
。噢,哇哦。我会解决的。谢谢,谢谢,汉斯,效果很好。然而,我的目标是提高性能,您的答案当然会使代码更具可读性,但不会提高性能。我如何重写它,性能得到了提高?您的嵌套列表实际上是一个简单的笛卡尔积