[英]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.