Что такое numpy-эквивалент expand в pytorch?

#python #numpy #pytorch

#python #numpy #pytorch

Вопрос:

Предположим, у меня есть массив numpy x формы [1,5] . Я хочу развернуть его вдоль оси 0 так, чтобы результирующий массив y имел форму [10,5] и y[i:i 1,:] был равен x для каждого i.

Если x бы это был тензор pytorch, я мог бы просто сделать

 y = x.expand(10,-1)
 

Но expand в numpy его нет, и те, которые выглядят так ( expand_dims и repeat ), похоже, ведут себя не так.


Пример:

 >>> import torch
>>> x = torch.randn(1,5)
>>> print(x)
tensor([[ 1.3306,  0.0627,  0.5585, -1.3128, -1.4724]])
>>> print(x.expand(10,-1))
tensor([[ 1.3306,  0.0627,  0.5585, -1.3128, -1.4724],
        [ 1.3306,  0.0627,  0.5585, -1.3128, -1.4724],
        [ 1.3306,  0.0627,  0.5585, -1.3128, -1.4724],
        [ 1.3306,  0.0627,  0.5585, -1.3128, -1.4724],
        [ 1.3306,  0.0627,  0.5585, -1.3128, -1.4724],
        [ 1.3306,  0.0627,  0.5585, -1.3128, -1.4724],
        [ 1.3306,  0.0627,  0.5585, -1.3128, -1.4724],
        [ 1.3306,  0.0627,  0.5585, -1.3128, -1.4724],
        [ 1.3306,  0.0627,  0.5585, -1.3128, -1.4724],
        [ 1.3306,  0.0627,  0.5585, -1.3128, -1.4724]])
 

Комментарии:

1. numpy.reshape ( numpy.org/doc/stable/reference/generated/numpy.reshape.html ) может быть, это то, что вы ищете?

2. @DaveIdito Нет. reshape просто изменяет форму, в то время expand как по существу копирует данные в новые измерения.

Ответ №1:

Вы можете достичь этого с np.broadcast_to помощью . Но вы не можете использовать отрицательные числа:

 >>> import numpy as np
>>> x = np.array([[ 1.3306,  0.0627,  0.5585, -1.3128, -1.4724]])
>>> print(np.broadcast_to(x,(10,5)))
[[ 1.3306  0.0627  0.5585 -1.3128 -1.4724]
 [ 1.3306  0.0627  0.5585 -1.3128 -1.4724]
 [ 1.3306  0.0627  0.5585 -1.3128 -1.4724]
 [ 1.3306  0.0627  0.5585 -1.3128 -1.4724]
 [ 1.3306  0.0627  0.5585 -1.3128 -1.4724]
 [ 1.3306  0.0627  0.5585 -1.3128 -1.4724]
 [ 1.3306  0.0627  0.5585 -1.3128 -1.4724]
 [ 1.3306  0.0627  0.5585 -1.3128 -1.4724]
 [ 1.3306  0.0627  0.5585 -1.3128 -1.4724]
 [ 1.3306  0.0627  0.5585 -1.3128 -1.4724]]
 

Ответ №2:

Вы можете использовать np.tile , который повторяет элементы заданной оси, как:

 >>> x = np.range(5)
>>> x = np.expand_dims(x, 0)
>>> x.shape
(1, 5)
>>> y = np.tile(x, (10, 1))  # repeat axis=0 10 times and axis=1 1 time
>>> y.shape
(10, 5)

 

Ответ №3:

numpy имеет numpy.newaxis

 y = x[:, np.newaxis]
 

Комментарии:

1. Я думаю, что это не то, что ищет OP: это просто добавляет новое измерение, но не расширяет существующие измерения.

2. Расширение обычно используется для умножения вектора на матрицу. numpy имеет широковещательную передачу numpy.org/doc/stable/user/basics.broadcasting.html так что расширение может быть излишним

3. Да, действительно, это работает точно так же, как и в pytorch. Но при явном выполнении этого используется немного другой метод.