将一维数组转换为二维数组,使每个元素都是结果中的一行



我想知道如何将这个:array([0, 1, 2, 3, 4, 5])转换为这个:

array([[0, 0, 0],
[1, 1, 1],
[2, 2, 2],
[3, 3, 3],
[4, 4, 4],
[5, 5, 5]])

简而言之,给定一个平面数组,将数组中的每个元素重复n次,以便每个元素创建包含n个相同元素的子数组,并将这些子数组连接成一个,以便每行包含原始数组中重复n次的一个元素。

我可以这样做:

def repeat(lst, n):
return [[e]*n for e in lst]
>repeat(range(10), 4)
[[0, 0, 0, 0],
[1, 1, 1, 1],
[2, 2, 2, 2],
[3, 3, 3, 3],
[4, 4, 4, 4],
[5, 5, 5, 5],
[6, 6, 6, 6],
[7, 7, 7, 7],
[8, 8, 8, 8],
[9, 9, 9, 9]]

如何在NumPy中做到这一点?

你可以这样使用numpy的repeat:

np.repeat(range(10), 4).reshape(10,4) 

给了:

[[0 0 0 0]
[1 1 1 1]
[2 2 2 2]
[3 3 3 3]
[4 4 4 4]
[5 5 5 5]
[6 6 6 6]
[7 7 7 7]
[8 8 8 8]
[9 9 9 9]]

您可以使用tile来处理尺寸:

a = np.array([0, 1, 2, 3, 4, 5])
N = 4
np.tile(a[:,None], (1, N))
# or
np.tile(a, (N, 1)).T

broadcast_to:

np.broadcast_to(a, (N, a.shape[0])).T
# or
np.broadcast_to(a[:,None], (a.shape[0], N))

或者乘以一个1数组:

a[:,None]*np.ones(N, dtype=a.dtype)

输出:

array([[0, 0, 0, 0],
[1, 1, 1, 1],
[2, 2, 2, 2],
[3, 3, 3, 3],
[4, 4, 4, 4],
[5, 5, 5, 5]])

最新更新