【问题标题】:Python: looping through values of two vectors [duplicate]Python:循环遍历两个向量的值
【发布时间】:2014-03-26 16:41:16
【问题描述】:

假设我有两个向量:

A=linspace(-2,0,6)
B=linspace(0,2,6)

我想创建一个二维矩阵(大小为 2 x 36),它将 A 中的所有值与 B 中的所有值匹配,所以它类似于:

[[-2 , 0]
[-2 , 0.4]
[-2 , 0.8]
[-2 , 1.2]
[-2 , 1.6]
[-2 , 2.0]
[-1.6 , 0]
[-1.6 , 0.4]
[-1.6 , 0.8]
....
....
[0 , 2.0]]

我猜我需要某种 for 循环,但我不完全确定如何执行此操作...

【问题讨论】:

  • 查看zip函数。
  • 嗨 @PaulH 我试过 zip(A,B) 但这并没有将 A 中的每个值附加到 B 中的每个值,它只是创建了一个长度为 2 x 6 的矩阵。

标签: python loops numpy vector


【解决方案1】:
>>> a = np.linspace(-2, 0, 6)
>>> b = np.linspace(0, 2, 6)
>>> 
>>> out = np.empty((len(a), len(b), 2))
>>> out[..., 0] = a[:, None]
>>> out[..., 1] = b[None, :]
>>> out = out.reshape(-1, 2)
>>> out
array([[-2. ,  0. ],
       [-2. ,  0.4],
       [-2. ,  0.8],
       [-2. ,  1.2],
       [-2. ,  1.6],
       [-2. ,  2. ],
       [-1.6,  0. ],
       [-1.6,  0.4],
       [-1.6,  0.8],
       [-1.6,  1.2],
       [-1.6,  1.6],
       [-1.6,  2. ],
       [-1.2,  0. ],
       [-1.2,  0.4],
       [-1.2,  0.8],
       [-1.2,  1.2],
       [-1.2,  1.6],
       [-1.2,  2. ],
       [-0.8,  0. ],
       [-0.8,  0.4],
       [-0.8,  0.8],
       [-0.8,  1.2],
       [-0.8,  1.6],
       [-0.8,  2. ],
       [-0.4,  0. ],
       [-0.4,  0.4],
       [-0.4,  0.8],
       [-0.4,  1.2],
       [-0.4,  1.6],
       [-0.4,  2. ],
       [ 0. ,  0. ],
       [ 0. ,  0.4],
       [ 0. ,  0.8],
       [ 0. ,  1.2],
       [ 0. ,  1.6],
       [ 0. ,  2. ]])

【讨论】:

    【解决方案2】:

    您可以使用嵌套列表推导来执行此操作。例如:

    [[a, b] for a in A for b in B]
    

    【讨论】:

      【解决方案3】:

      如果您使用pandas.DataFrame,这是通过在两个数组之间执行连接操作来实现的,其中每个数组都被赋予一个对于所有条目都是恒定的“键”。

      你的例子会这样工作:

      In [271]: A=linspace(-2,0,6)
      
      In [272]: B=linspace(0,2,6)
      
      In [273]: A
      Out[273]: array([-2. , -1.6, -1.2, -0.8, -0.4,  0. ])
      
      In [274]: A = pandas.DataFrame({'A':linspace(-2,0,6)})
      
      In [275]: B = pandas.DataFrame({'B':linspace(0,2,6)})
      
      In [276]: A['key'] = 1
      
      In [277]: B['key'] = 1
      
      In [278]: pandas.merge(A, B, on='key')
      Out[278]: 
            A  key    B
      0  -2.0    1  0.0
      1  -2.0    1  0.4
      2  -2.0    1  0.8
      3  -2.0    1  1.2
      4  -2.0    1  1.6
      5  -2.0    1  2.0
      6  -1.6    1  0.0
      7  -1.6    1  0.4
      8  -1.6    1  0.8
      9  -1.6    1  1.2
      10 -1.6    1  1.6
      11 -1.6    1  2.0
      12 -1.2    1  0.0
      13 -1.2    1  0.4
      14 -1.2    1  0.8
      15 -1.2    1  1.2
      16 -1.2    1  1.6
      17 -1.2    1  2.0
      18 -0.8    1  0.0
      19 -0.8    1  0.4
      20 -0.8    1  0.8
      21 -0.8    1  1.2
      22 -0.8    1  1.6
      23 -0.8    1  2.0
      24 -0.4    1  0.0
      25 -0.4    1  0.4
      26 -0.4    1  0.8
      27 -0.4    1  1.2
      28 -0.4    1  1.6
      29 -0.4    1  2.0
      30  0.0    1  0.0
      31  0.0    1  0.4
      32  0.0    1  0.8
      33  0.0    1  1.2
      34  0.0    1  1.6
      35  0.0    1  2.0
      
      In [279]: pandas.merge(A, B, on='key')[['A','B']].values
      Out[279]: 
      array([[-2. ,  0. ],
             [-2. ,  0.4],
             [-2. ,  0.8],
             [-2. ,  1.2],
             [-2. ,  1.6],
             [-2. ,  2. ],
             [-1.6,  0. ],
             [-1.6,  0.4],
             [-1.6,  0.8],
             [-1.6,  1.2],
             [-1.6,  1.6],
             [-1.6,  2. ],
             [-1.2,  0. ],
             [-1.2,  0.4],
             [-1.2,  0.8],
             [-1.2,  1.2],
             [-1.2,  1.6],
             [-1.2,  2. ],
             [-0.8,  0. ],
             [-0.8,  0.4],
             [-0.8,  0.8],
             [-0.8,  1.2],
             [-0.8,  1.6],
             [-0.8,  2. ],
             [-0.4,  0. ],
             [-0.4,  0.4],
             [-0.4,  0.8],
             [-0.4,  1.2],
             [-0.4,  1.6],
             [-0.4,  2. ],
             [ 0. ,  0. ],
             [ 0. ,  0.4],
             [ 0. ,  0.8],
             [ 0. ,  1.2],
             [ 0. ,  1.6],
             [ 0. ,  2. ]])
      

      【讨论】:

        【解决方案4】:

        itertools.product 正是这样做的工具

        import itertools
        result = array(list(itertools.product(A, B)))
        

        【讨论】:

        • 我刚试过这个,但得到错误:NameError: name 'itertools' is not defined。我需要从某处导入该功能吗?谢谢
        • 谢谢,但这会创建一个列表,有没有办法让矩阵输出代替?
        • @userk: 只需将 numpy array 构造函数应用于列表以获取矩阵
        猜你喜欢
        • 2019-09-16
        • 2012-01-22
        • 2012-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多