Numpy: вставить строку 0 для каждого массива в массив массивов - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть трехмерный массив numpy размера (5000, 8, 9)

Я хотел бы вставить строку 0 в качестве первой строки для каждого из 5000 массивов, так что новая форма будет (5000, 9, 9), а первая строка будет 0 с.

Как я могу сделать это элегантно в numpy?

РЕДАКТИРОВАТЬ:

Спасибо за вдохновение, Бен. Я пытаюсь, но у меня его пока нет. Вот MWE того, что у меня есть до сих пор:

>>> import numpy as np
>>> n1 = np.array([[[1,2,3], [4,5,6], [7, 8, 9], [10, 11, 12]], [[3, 2, 1], [4, 3, 2], [5,4,3], [6,5,4]]])
>>> n1
array([[[ 1,  2,  3],
        [ 4,  5,  6],
        [ 7,  8,  9],
        [10, 11, 12]],

       [[ 3,  2,  1],
        [ 4,  3,  2],
        [ 5,  4,  3],
        [ 6,  5,  4]]])
>>> proper = np.zeros(((3, 4, 3)))
>>> proper
array([[[0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.]],

       [[0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.]],

       [[0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.]]])
>>> np.insert(proper, n1, axis=1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: insert() takes at least 3 arguments (3 given)

>>> np.insert(proper, 0, n1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/.../pkgs/anaconda2/lib/python2.7/site-packages/numpy/lib/function_base.py", line 4435, in insert 
    new[tuple(slobj)] = values
ValueError: could not broadcast input array from shape (2,4,3) into shape (2)

>>> np.insert(n1, 0, proper)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/.../pkgs/anaconda2/lib/python2.7/site-packages/numpy/lib/function_base.py", line 4435, in insert 
    new[tuple(slobj)] = values
ValueError: could not broadcast input array from shape (3,4,3) into shape (3)

Ответы [ 2 ]

1 голос
/ 11 февраля 2020

Рассмотрим следующее: пусть n1 будет любым тензором согласно вашей требуемой фигуре:

n1 = np.empty(shape=(5000, 8, 9))
print(n1.shape)

Мы добавим вектор по 0-му индексу и установим требуемую ось

n2 = np.insert(n1, 0, np.ones(shape=(1,)), axis=1)
print(n2.shape)

Вы можете проверить с помощью

print(n2[0][0])
print(n2[1][0])

Надеюсь, это поможет.

0 голосов
/ 11 февраля 2020

Вы можете создать новый массив, заполненный нулями, и вставить свой исходный массив в него, используя индексирование:

a = np.arange(5000*8*9).reshape(5000,8,9)
b = np.zeros((5000,9,9))
b[:,1:,:] = a
b[0]
>>> array([[ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
           [ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.],
           [ 9., 10., 11., 12., 13., 14., 15., 16., 17.],
           [18., 19., 20., 21., 22., 23., 24., 25., 26.],
           [27., 28., 29., 30., 31., 32., 33., 34., 35.],
           [36., 37., 38., 39., 40., 41., 42., 43., 44.],
           [45., 46., 47., 48., 49., 50., 51., 52., 53.],
           [54., 55., 56., 57., 58., 59., 60., 61., 62.],
           [63., 64., 65., 66., 67., 68., 69., 70., 71.]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...