Как изменить массив Numpy с добавленными нулями - PullRequest
2 голосов
/ 27 июня 2019

У меня есть массив Numpy, который выглядит как

array([1, 2, 3, 4, 5, 6, 7, 8])

, и я хочу преобразовать его в массив

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

Более конкретно, я пытаюсь изменить форму двумерного numpyмассив, чтобы получить массив 3D Numpy для перехода от

array([[ 1,  2,  3,  4,  5,  6,  7,  8],
       [ 9, 10, 11, 12, 13, 14, 15, 16],
       [17, 18, 19, 20, 21, 22, 23, 24],
       ...
       [ 9, 10, 11, 12, 13, 14, 15, 16],
       [89, 90, 91, 92, 93, 94, 95, 96]])

к массиву numpy, который выглядит как

array([[[ 5,  0,  0,  6],
        [ 0,  1,  2,  0],
        [ 0,  3,  4,  0],
        [ 7,  0,  0,  8]],

       [[13,  0,  0, 14],
        [ 0,  9, 10,  0],
        [ 0, 11, 12,  0],
        [15,  0,  0, 16]],
       ...
       [[93,  0,  0, 94],
        [ 0, 89, 90,  0],
        [ 0, 91, 92,  0],
        [95,  0,  0, 96]]])

Есть ли эффективный способ сделать это, используя функциональность numpy, особенно векторизованную?

1 Ответ

3 голосов
/ 27 июня 2019

Мы можем использовать slicing -

def expand(a): # a is 2D array      
    out = np.zeros((len(a),4,4),dtype=a.dtype)
    out[:,1:3,1:3] = a[:,:4].reshape(-1,2,2)
    out[:,::3,::3] = a[:,4:].reshape(-1,2,2)
    return out

Преимущество - память и, следовательно, производительность.эффективность, так как только вывод будет занимать пространство памяти.Шаги включали работу с видами благодаря нарезке на входе и выходе.

Пробный прогон -

2D вход:

In [223]: a
Out[223]: 
array([[ 1,  2,  3,  4,  5,  6,  7,  8],
       [ 9, 10, 11, 12, 13, 14, 15, 16]])

In [224]: expand(a)
Out[224]: 
array([[[ 5,  0,  0,  6],
        [ 0,  1,  2,  0],
        [ 0,  3,  4,  0],
        [ 7,  0,  0,  8]],

       [[13,  0,  0, 14],
        [ 0,  9, 10,  0],
        [ 0, 11, 12,  0],
        [15,  0,  0, 16]]])

1D вход (подача в 2D расширеннаяввод с None):

In [225]: a = np.array([1, 2, 3, 4, 5, 6, 7, 8])

In [226]: expand(a[None])
Out[226]: 
array([[[5, 0, 0, 6],
        [0, 1, 2, 0],
        [0, 3, 4, 0],
        [7, 0, 0, 8]]])
...