Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python:避免嵌套for循环_Python_Python 3.x_For Loop_Map Function - Fatal编程技术网

python:避免嵌套for循环

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()不是解决这个问题的好方法,因为您想要的结果是嵌套的,而

例如,如何避免在下面的代码中嵌套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()
不是解决这个问题的好方法,因为您想要的结果是嵌套的,而不是扁平的。这比仅仅使用列表理解来达到你想要的结果要详细一点。这里有一种更简洁的初始化
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
。噢,哇哦。我会解决的。谢谢,谢谢,汉斯,效果很好。然而,我的目标是提高性能,您的答案当然会使代码更具可读性,但不会提高性能。我如何重写它,性能得到了提高?您的嵌套列表实际上是一个简单的笛卡尔积将在不嵌套的情况下为您提供相同的索引。