Предположим, у меня есть пустой массив x
формы [1,5]
. Я хочу расширить его по оси 0 так, чтобы результирующий массив y
имел форму [10,5] и y[i:i+1,:]
был равен x
для каждого i.
Если бы x
был тензором pytorch, я мог бы просто сделать
y = x.expand(10,-1)
Но в numpy нет expand
, и те, которые похожи на него (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]])
@DaveIdito Нет. reshape просто изменяет форму, а expand
по существу копирует данные в новые измерения.
у numpy есть numpy.newaxis
y = x[:, np.newaxis]
Я думаю, что это не то, что ищет OP: это просто добавляет новое измерение, но не расширяет существующие измерения.
Расширение обычно используется для умножения вектора на матрицу. numpy имеет вещание numpy.org/doc/stable/user/basics.broadcasting.html поэтому расширение может быть излишним
Да, действительно, это работает точно так же, как в pytorch. Но явно для этого используется немного другой метод.
Вы можете добиться этого с помощью 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]]
Вы можете использовать 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)
numpy.reshape (numpy.org/doc/stable/reference/generated/numpy.reshape.html) может быть тем, что вы ищете?