#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. Но при явном выполнении этого используется немного другой метод.