【问题标题】:Concatenate arrays with different shape duplicating values连接具有不同形状重复值的数组
【发布时间】:2021-01-19 21:52:45
【问题描述】:

我有一个形状数组:(15,2)。我还有另一个包含值的数组:[0, 3, 5]

我想在第一个数组中使用第二个数组中的值创建另一列,其中前 5 行的值为 0,第 6-10 行的值为 3,最后 5 行的值为 5。

像这样:

[0,
 0,
 0,
 0,
 0,
 3,
 3,
 3,
 3,
 3,
 5,
 5,
 5,
 5,
 5]

有没有 numpy 方法可以做到这一点?

谢谢!

【问题讨论】:

    标签: python arrays numpy matrix


    【解决方案1】:

    你可以使用numpy内置的repeatstacking:

    a = np.zeros((15,2))
    b = np.array([0,3,5])
    np.hstack((a, np.repeat(b,5)[:,None]))
    

    输出:

    [[0. 0. 0.]
     [0. 0. 0.]
     [0. 0. 0.]
     [0. 0. 0.]
     [0. 0. 0.]
     [0. 0. 3.]
     [0. 0. 3.]
     [0. 0. 3.]
     [0. 0. 3.]
     [0. 0. 3.]
     [0. 0. 5.]
     [0. 0. 5.]
     [0. 0. 5.]
     [0. 0. 5.]
     [0. 0. 5.]]
    

    【讨论】:

    • 谢谢!一个问题,[:,None] 切片是什么意思?
    • @joann2555 None 为数组添加一个额外的维度(在添加的位置,这里是[:,None] 中的第二个维度)。它是np.newaxis 的别名。基本上,我们正在添加另一个维度,以便在堆叠时将正确的维度堆叠在一起。
    【解决方案2】:
    rand = np.random.random((15,2)) # shape is (15,2)
    vals = np.array([0,3,5]) # shape is (3,)
    res = np.concatenate(([np.full((rand.shape[0]//vals.shape[0],), val) for val in vals]), axis=0)
    res
    

    输出:

    array([0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 5, 5, 5, 5, 5])
    

    最后,

    final = np.hstack((rand, res.reshape(15,1)))
    final
    

    输出:

    array([[0.29759807, 0.60548479, 0.        ],
           [0.61242249, 0.46456274, 0.        ],
           [0.86172011, 0.2963868 , 0.        ],
           [0.91728575, 0.36366023, 0.        ],
           [0.56488556, 0.82130321, 0.        ],
           [0.59482141, 0.46148353, 3.        ],
           [0.7762271 , 0.25415058, 3.        ],
           [0.09176551, 0.9687253 , 3.        ],
           [0.06473259, 0.34686598, 3.        ],
           [0.69542414, 0.15540001, 3.        ],
           [0.02880707, 0.23169327, 5.        ],
           [0.90004256, 0.22145591, 5.        ],
           [0.61596969, 0.46807342, 5.        ],
           [0.02263769, 0.68522023, 5.        ],
           [0.81777274, 0.58145853, 5.        ]])
    

    【讨论】:

      【解决方案3】:

      使用np.concatenate

      • 将您的第二个数组转换为二维“向量”数组,其中每行有 1 列
      a = [0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 5, 5, 5, 5, 5] # your list of [0, 3, 5]
      a = np.array([a]).T # [ [0], [0], [0], ..., [5] ] the "vector" array
      

      那么简单

      b = np.array([[i, i +1] for i in range(15)]) # some example 15x2 array
      print(np.concatenate((b, a), axis=1)) 
      

      输出是

      array([[ 0,  1,  0],
             [ 1,  2,  0],
             [ 2,  3,  0],
             [ 3,  4,  0],
             [ 4,  5,  0],
             [ 5,  6,  3],
             [ 6,  7,  3],
             [ 7,  8,  3],
             [ 8,  9,  3],
             [ 9, 10,  3],
             [10, 11,  5],
             [11, 12,  5],
             [12, 13,  5],
             [13, 14,  5],
             [14, 15,  5]])
      

      【讨论】:

        猜你喜欢
        • 2019-10-02
        • 1970-01-01
        • 2019-04-16
        • 2015-06-30
        • 2016-11-20
        • 2020-05-06
        • 2017-10-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多