Как создать новое измерение с NumPy?(используя быструю операцию) - PullRequest
0 голосов
/ 10 мая 2018

Я хочу новый массив numpy, основанный на x, y. Новый массив, который я хочу, содержит элементы x и y.

Вот формула повторения:

new[i,j] = [x[i,j],y[i,j]] 

Итак, размер нового массива: (x (= y) .shape, 2)

Пример:

x = np.arange(4).reshape(2,2)
y = np.arrange(-3,0).reshape(2,2)
"""
x = array([[0, 1],
           [2, 3]])
y = array([[-3, -2],
           [-1,  0]])
"""

Тогда я хочу создать ниже,

array([[[ 0,  -3],
        [ 1,  -2]],

       [[ 2, -1],
        [ 3, 0]]])

Я пробовал это, используя быструю операцию, как это:

new = np.array([x,y])
"""
new =
array([[[ 0,  1],
        [ 2,  3]],

       [[-3, -2],
        [-1,  0]]])
"""

Конечно, я могу использовать цикл, но фактический размер x и y слишком велик. Поэтому время расчета будет слишком длинным. Я хочу создать массив с помощью быстрой операции из-за быстрого расчета.

1 Ответ

0 голосов
/ 10 мая 2018
In [4]: x = np.arange(4).reshape(2,2)
   ...: y = np.arange(-3,1).reshape(2,2)
   ...: 

np.array объединяет элементы вдоль новой первой оси:

In [5]: np.array((x,y))
Out[5]: 
array([[[ 0,  1],
        [ 2,  3]],

       [[-3, -2],
        [-1,  0]]])

np.stack с осью по умолчанию 0 делает то же самое:

In [6]: np.stack((x,y))
Out[6]: 
array([[[ 0,  1],
        [ 2,  3]],

       [[-3, -2],
        [-1,  0]]])

Но мы можем указать другую новую ось:

In [7]: np.stack((x,y), axis=2)
Out[7]: 
array([[[ 0, -3],
        [ 1, -2]],

       [[ 2, -1],
        [ 3,  0]]])

Мы также можем достичь этого, выполнив 3D транспонирование: В [9]: np.array ((x, y)). Transpose (1,2,0) Из [9]: массив ([[[0, -3], [1, -2]],

       [[ 2, -1],
        [ 3,  0]]])

Ваша двойная транспонирование аналогично, за исключением того, что сначала x.transpose(0,1), а затем заканчивается transpose(0,1,2).

Требуемую транспонирование легче визуализировать, если размеры различаются, например, (2,3,4) вместо (2,2,2).

stack расширяет размеры входов и объединяет их. Это удобно, но не делать ничего, что вы не можете сделать напрямую:

np.concatenate((x[...,None],y[...,None]), axis=2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...