Проблема с порядком измерений при клонировании 1-мерного массива numpy в 3 измерения - PullRequest
0 голосов
/ 04 декабря 2018

У меня проблемы с поиском способа клонирования 1-D массива для создания 3-D массива.Скажем, например, у меня есть

z = np.array([0, 2, 3, 5, 7, 9, 10])

Это представляет вертикальный столбец в трехмерном пространстве (скажем, в метрах, например).Я хочу создать горизонтальное измерение (x, y), чтобы конечный массив имел размеры (len(z), len(x), len(y)), где каждый столбец в каждой точке x, y одинаков.Я делаю это так, чтобы я мог сопоставить пространственные измерения с другими имеющимися у меня трехмерными данными.

То есть с массивом z в качестве входных данных и заданными горизонтальными размерами, скажем, ndimx = 3, ndimy = 2, я хочу найти функцию, которая выводит массив

np.array([ [[0, 0], [0, 0], [0, 0]],  
           [[2, 2], [2, 2], [2, 2]],       
           [[3, 3], [3, 3], [3, 3]],       
           [[5, 5], [5, 5], [5, 5]],       
           [[7, 7], [7, 7], [7, 7]],       
           [[9, 9], [9, 9], [9, 9]],       
           [[10, 10], [10, 10], [10, 10]] ])

, который имеет форму (7, 3, 2).Сначала это показалось мне тривиальным, но после нескольких лет экспериментов с np.dstack (), np.astype (), np.repeat () и транспонированием с () .T, я не могу получить правильный размерный порядок.

Здесь важно то, что вертикальный столбец - это первое измерение.Я готов поспорить, что ответ на самом деле тривиален, я просто не могу найти магическую функцию, которая будет делать это.

Есть предложения?

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018
In [360]: z = np.array([0, 2, 3, 5, 7, 9, 10])
In [361]: z1 = np.stack([z,z], axis=1)
In [362]: z2 = np.stack([z1,z1,z1],axis=1)
In [363]: z2
Out[363]: 
array([[[ 0,  0],
        [ 0,  0],
        [ 0,  0]],

       [[ 2,  2],
        [ 2,  2],
        [ 2,  2]],

       [[ 3,  3],
        [ 3,  3],
        [ 3,  3]],

      ... 
       [[10, 10],
        [10, 10],
        [10, 10]]])
0 голосов
/ 04 декабря 2018

Мы можем просто получить представление о входных данных z с помощью np.broadcast_to без дополнительных затрат памяти и, как таковых, практически без затрат на производительность -

np.broadcast_to(z[:,None,None],(len(z),ndimx,ndimy))

Пример выполнения -

In [23]: z
Out[23]: array([ 0,  2,  3,  5,  7,  9, 10])

In [24]: ndimx=3; ndimy=2

In [25]: np.broadcast_to(z[:,None,None],(len(z),ndimx,ndimy))
Out[25]: 
array([[[ 0,  0],
        [ 0,  0],
        [ 0,  0]],

       [[ 2,  2],
        [ 2,  2],
        [ 2,  2]],

       [[ 3,  3],
        [ 3,  3],
        [ 3,  3]],

       [[ 5,  5],
        [ 5,  5],
        [ 5,  5]],

       [[ 7,  7],
        [ 7,  7],
        [ 7,  7]],

       [[ 9,  9],
        [ 9,  9],
        [ 9,  9]],

       [[10, 10],
        [10, 10],
        [10, 10]]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...