【问题标题】:How to merge ith values of two different array in one array python如何在一个数组python中合并两个不同数组的值
【发布时间】:2018-12-01 03:31:37
【问题描述】:

我有一个解决特定问题的方法

[[0.34 0.26 0.76 ]
 [0.79 0.82 0.37 ]
 [0.93 0.87 0.94]]

对于同样的问题,我有另一个解决方案

[[0.21 0.73 0.69 ]
 [0.35 0.24 0.53]
 [0.01 0.42 0.50]]

现在我必须将它们的第 i 个位置合并在一起,这样结果数组就会像

[[0.34 0.21]
[0.26 0.73]
[0.76 0.69]
[0.79 0.35]
..........
..........

【问题讨论】:

    标签: python numpy multidimensional-array numpy-ndarray


    【解决方案1】:

    设置

    x = np.array([[0.34, 0.26, 0.76 ],  [0.79, 0.82, 0.37 ],  [0.93, 0.87, 0.94]])
    y = np.array([[0.21, 0.73, 0.69 ],  [0.35, 0.24, 0.53],  [0.01, 0.42, 0.50]])
    

    dstackravel

    np.dstack([x.ravel(), y.ravel()])
    
    array([[[0.34, 0.21],
            [0.26, 0.73],
            [0.76, 0.69],
            [0.79, 0.35],
            [0.82, 0.24],
            [0.37, 0.53],
            [0.93, 0.01],
            [0.87, 0.42],
            [0.94, 0.5 ]]])
    

    如果您担心这个引入的额外维度,您可以vstack 并转置:

    np.vstack([x.ravel(), y.ravel()]).T
    
    array([[0.34, 0.21],
           [0.26, 0.73],
           [0.76, 0.69],
           [0.79, 0.35],
           [0.82, 0.24],
           [0.37, 0.53],
           [0.93, 0.01],
           [0.87, 0.42],
           [0.94, 0.5 ]])
    

    使用 np.column_stack

    的另一种选择
    np.column_stack([x.ravel(), y.ravel()])
    

    【讨论】:

    • 是的,vstack 并不总是有效,但 dstack 可以解决问题,感谢您的回答
    • @ShivamSharma 介意解释为什么vstack 的转置在这里不起作用?
    【解决方案2】:

    您可以在 2 个数组上使用 vstack 并适当地重塑:

    np.vstack([arr1,arr2]).reshape(2,-1).T
    

    例子:

    >>> arr1
    array([[ 0.34,  0.26,  0.76],
           [ 0.79,  0.82,  0.37],
           [ 0.93,  0.87,  0.94]])
    >>> arr2
    array([[ 0.21,  0.73,  0.69],
           [ 0.35,  0.24,  0.53],
           [ 0.01,  0.42,  0.5 ]])
    
    >>> np.vstack([arr1,arr2]).reshape(2,-1).T
    array([[ 0.34,  0.21],
           [ 0.26,  0.73],
           [ 0.76,  0.69],
           [ 0.79,  0.35],
           [ 0.82,  0.24],
           [ 0.37,  0.53],
           [ 0.93,  0.01],
           [ 0.87,  0.42],
           [ 0.94,  0.5 ]])
    

    【讨论】:

      【解决方案3】:

      这是一个不需要 numpy 的单行:

      [list(a) for a in zip(sum(x, []), sum(y, []))]
      

      sum(x, []) 将列表列表扁平化为单个扁平列表。然后我们将两个列表压缩在一起并列出元素。

      【讨论】:

      • 有很多比sum(x, [])更好的扁平化列表的方法
      • 不会反对。我宁愿使用reduce 来提高可读性和速度,但这更有趣。
      【解决方案4】:

      你可以这样使用ravel()numpy.concatenate(x,y,axis)

      np.concatenate((np.reshape(x.ravel(),(-1,1)),np.reshape(y.ravel(),(-1,1))),axis=1)
      
      [[ 0.34  0.21]
       [ 0.26  0.73]
       [ 0.76  0.69]
       [ 0.79  0.35]
       [ 0.82  0.24]
       [ 0.37  0.53]
       [ 0.93  0.01]
       [ 0.87  0.42]
       [ 0.94  0.5 ]]
      

      【讨论】:

        【解决方案5】:

        这里有更多方法可以做同样的事情。在可读性方面,numpy.ndarray.flatten 更直接。


        输入数组:

        In [207]: arr1
        Out[207]: 
        array([[0.34, 0.26, 0.76],
               [0.79, 0.82, 0.37],
               [0.93, 0.87, 0.94]])
        
        In [208]: arr2
        Out[208]: 
        array([[0.21, 0.73, 0.69],
               [0.35, 0.24, 0.53],
               [0.01, 0.42, 0.5 ]])
        

        第一步,将它们展平:

        In [209]: arr1_flattened = arr1.flatten()[:, np.newaxis]
        
        In [210]: arr1_flattened
        Out[210]: 
        array([[0.34],
               [0.26],
               [0.76],
               [0.79],
               [0.82],
               [0.37],
               [0.93],
               [0.87],
               [0.94]])
        
        In [211]: arr2_flattened = arr2.flatten()[:, np.newaxis]
        
        In [212]: arr2_flattened
        Out[212]: 
        array([[0.21],
               [0.73],
               [0.69],
               [0.35],
               [0.24],
               [0.53],
               [0.01],
               [0.42],
               [0.5 ]])
        

        然后将它们连接或堆叠:

        # just horizontally stack (np.hstack) the flattened arrays
        In [213]: np.hstack([arr1_flattened, arr2_flattened])
        Out[213]: 
        array([[0.34, 0.21],
               [0.26, 0.73],
               [0.76, 0.69],
               [0.79, 0.35],
               [0.82, 0.24],
               [0.37, 0.53],
               [0.93, 0.01],
               [0.87, 0.42],
               [0.94, 0.5 ]])
        

        一行:

        In [205]: np.hstack([arr1.flatten()[:, None], arr2.flatten()[:, None]])
        Out[205]: 
        array([[0.34, 0.21],
               [0.26, 0.73],
               [0.76, 0.69],
               [0.79, 0.35],
               [0.82, 0.24],
               [0.37, 0.53],
               [0.93, 0.01],
               [0.87, 0.42],
               [0.94, 0.5 ]])
        
        # same thing can be done using np.concatenate
        In [206]: np.concatenate([arr1.flatten()[:, None], arr2.flatten()[:, None]], axis=1)
        Out[206]: 
        array([[0.34, 0.21],
               [0.26, 0.73],
               [0.76, 0.69],
               [0.79, 0.35],
               [0.82, 0.24],
               [0.37, 0.53],
               [0.93, 0.01],
               [0.87, 0.42],
               [0.94, 0.5 ]])
        

        请注意,所有堆叠方法(stackhstackvstackdstackcolumn_stack)在后台调用 numpy.concatenate()

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-06-12
          • 1970-01-01
          • 1970-01-01
          • 2022-12-13
          • 2019-09-19
          • 1970-01-01
          • 1970-01-01
          • 2016-07-20
          相关资源
          最近更新 更多