Расширение массива по определенному измерению - PullRequest
0 голосов
/ 22 марта 2019

У меня есть массив, как показано ниже:

arr = np.arange(2*1*15).reshape(2, 1, 15)

Теперь, как мне расширить этот массив, чтобы сформировать (2, 10, 15). Для заполнения значений можно использовать те же значения, что и в части (1, 15) исходного массива (т. Е. Из двух последних измерений).

Ответы [ 2 ]

1 голос
/ 22 марта 2019

Тем временем я понял, что numpy.broadcast_to также может выполнять эту работу.

В качестве небольшого надуманного примера:

In [8]: np.broadcast_to(arr, (2, 5, 15))
Out[8]: 
array([[[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14],
        [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14],
        [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14],
        [ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14],
        [ 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],
        [15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29],
        [15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29],
        [15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29],
        [15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29]]])

Примечание по производительности : После определения времени я обнаружил, что numpy.broadcast_to составляет ок. 40x быстрее по сравнению с numpy.repeat. причина этого прироста производительности заключается в том, что:

Это быстрее, потому что создает представление данных, доступное только для чтения, с большим количеством элементов, указывающих на одни и те же области памяти. Если вы скопируете результат, производительность будет примерно такой же. Если вам не нужно редактировать конечный результат, он обеспечивает значительный прирост производительности

1 голос
/ 22 марта 2019

Вы можете использовать numpy.repeat для дублирования значений по второй оси:

np.repeat(arr, 10, axis=1).shape
# (2, 10, 15)
...