繁体   English   中英

Numpy:如何将单个数组堆叠成更大数组的每一行并将其变成二维数组?

[英]Numpy: How to stack a single array into each row of a bigger array and turn it into a 2D array?

我有一个名为heartbeats的 numpy 数组,有 100 行。 每行有 5 个元素。

我还有一个名为time_index的数组,其中包含 5 个元素。 我需要将time index添加到每一行heartbeats

heartbeats = np.array([
    [-0.58, -0.57, -0.55, -0.39, -0.40],
    [-0.31, -0.31, -0.32, -0.46, -0.46]
])
time_index = np.array([-2, -1, 0, 1, 2])

我需要的:

array([-2, -0.58],
      [-1, -0.57],
      [0, -0.55],
      [1, -0.39],
      [2, -0.40],
      [-2, -0.31],
      [-1, -0.31],
      [0, -0.32],
      [1, -0.46],
      [2, -0.46])

我只写了两行heartbeats来说明。

假设您使用的是 numpy,您正在寻找的确切输出数组可以通过将time_index的重复版本与heartbeats的 raveled 版本堆叠起来:

np.stack((np.tile(time_index, len(heartbeats)), heartbeats.ravel()), axis=-1)

另一种方法,使用广播

In [13]: heartbeats = np.array([
    ...:     [-0.58, -0.57, -0.55, -0.39, -0.40],
    ...:     [-0.31, -0.31, -0.32, -0.46, -0.46]
    ...: ])
    ...: time_index = np.array([-2, -1, 0, 1, 2])

制作一个目标数组:

In [14]: res = np.zeros(heartbeats.shape + (2,), heartbeats.dtype)

In [15]: res[:,:,1] = heartbeats     # insert a (2,5) into a (2,5) slot

In [17]: res[:,:,0] = time_index[None]   # insert a (5,) into a (2,5) slot

In [18]: res
Out[18]: 
array([[[-2.  , -0.58],
        [-1.  , -0.57],
        [ 0.  , -0.55],
        [ 1.  , -0.39],
        [ 2.  , -0.4 ]],

       [[-2.  , -0.31],
        [-1.  , -0.31],
        [ 0.  , -0.32],
        [ 1.  , -0.46],
        [ 2.  , -0.46]]])

然后重塑为2d:

In [19]: res.reshape(-1,2)
Out[19]: 
array([[-2.  , -0.58],
       [-1.  , -0.57],
       [ 0.  , -0.55],
       [ 1.  , -0.39],
       [ 2.  , -0.4 ],
       [-2.  , -0.31],
       [-1.  , -0.31],
       [ 0.  , -0.32],
       [ 1.  , -0.46],
       [ 2.  , -0.46]])

[17]采用 (5,),将其扩展为 (1,5),然后扩展为 (2,5) 以进行插入。 阅读broadcasting

作为替代方法,您可以根据指定的时间通过np.concatenate重复time_index

concatenated = np.concatenate([time_index] * heartbeats.shape[0])
# [-2 -1  0  1  2 -2 -1  0  1  2]

# result = np.dstack((concatenated, heartbeats.reshape(-1))).squeeze()
result = np.array([concatenated, heartbeats.reshape(-1)]).T

使用np.concatenate可能比np.tile更快。 此解决方案比Mad Physicist更快,但最快的是使用广播作为hpaulj的答案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM