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

Convert one-dimensional array to two-dimensional array so that each element is a row in the result

我想知道如何将这个: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))

或者乘以一个数组:

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]])

你也可以用这个

import numpy as np

def oned_to_2d(array_length, number_of_value):
    data = np.empty([0,number_of_value])
    for i in range(0,array_length):
        a = np.array(number_of_value*[i])
        data = np.append(data, np.array([a]),axis=0)
    return data

oned_to_2d(4,4)

输出为

array([[0., 0., 0., 0.],
   [1., 1., 1., 1.],
   [2., 2., 2., 2.],
   [3., 3., 3., 3.]])