Иногда полезно «клонировать» вектор строки или столбца в матрицу. Под клонированием я подразумеваю преобразование вектора строки, такого как
[1,2,3]
В матрицу
[[1,2,3]
[1,2,3]
[1,2,3]
]
или вектор столбца, такой как
[1
2
3
]
в
[[1,1,1]
[2,2,2]
[3,3,3]
]
В matlab или octave это делается довольно легко:
x = [1,2,3]
a = ones(3,1) * x
a =
1 2 3
1 2 3
1 2 3
b = (x') * ones(1,3)
b =
1 1 1
2 2 2
3 3 3
Я хочу повторить это по-тупому, но безуспешно
In [14]: x = array([1,2,3])
In [14]: ones((3,1)) * x
Out[14]:
array([[ 1., 2., 3.],
[ 1., 2., 3.],
[ 1., 2., 3.]])
# so far so good
In [16]: x.transpose() * ones((1,3))
Out[16]: array([[ 1., 2., 3.]])
# DAMN
# I end up with
In [17]: (ones((3,1)) * x).transpose()
Out[17]:
array([[ 1., 1., 1.],
[ 2., 2., 2.],
[ 3., 3., 3.]])
Почему не первый метод ( In [16]
) не работает? Есть ли способ выполнить эту задачу в Python более элегантным способом?
python
numpy
linear-algebra
Борис Горелик
источник
источник
repmat
:repmat([1 2 3],3,1)
илиrepmat([1 2 3].',1,3)
repmat
.tile_df
здесьОтветы:
Вот элегантный Pythonic способ сделать это:
[16]
похоже, проблема в том, что транспонирование не влияет на массив. вы, вероятно, хотите вместо матрицы:источник
(N,1)
массив -образной формы с помощью.reshape(-1, 1)
)numpy.tile
как показано в ответе Pv .Используйте
numpy.tile
:или для повторяющихся столбцов:
источник
tile
метод в 19,5 раз быстрее, чем метод из принятого в настоящее время ответа (с использованием метода умножения-оператора).(1, 3)
копирует этот столбец более трех раз, поэтому строки результата содержат каждый отдельный элемент.Во-первых, обратите внимание, что при вещании Numpy обычно нет необходимости дублировать строки и столбцы. Смотрите это и это для описания.
Но сделать это, повторить и newaxis , вероятно, лучший способ
Этот пример для вектора строки, но, надеюсь, применение этого к вектору столбца очевидно. повторение, кажется, записывает это хорошо, но вы также можете сделать это с помощью умножения, как в вашем примере
источник
np.repeat
противnp.tile
?Позволять:
Распределение по нулевой стоимости
Вид не несет никакой дополнительной памяти. Таким образом, эти объявления являются мгновенными:
Принудительное распределение
Если вы хотите, чтобы содержимое находилось в памяти:
Все три метода примерно одинаковой скорости.
вычисление
Все три метода примерно одинаковой скорости.
Вывод
Если вы хотите выполнить репликацию перед вычислением, рассмотрите возможность использования одного из методов «нулевого распределения». Вы не будете страдать от производительности "принудительного распределения".
источник
Я думаю, что использование трансляции в NumPy является лучшим и быстрее
Я сделал сравнение следующим образом
примерно в 15 раз быстрее, используя трансляцию
источник
None
чтобы сделать то же самое.Одно чистое решение - использовать функцию внешнего продукта NumPy с вектором единиц:
дает
n
повторяющиеся строки. Переключите порядок аргументов, чтобы получить повторяющиеся столбцы. Чтобы получить одинаковое количество строк и столбцов, вы можете сделатьисточник
Ты можешь использовать
плитка будет генерировать повторения вектора
и изменить форму придаст ей желаемую форму
источник
Если у вас есть датафрейм Pandas и вы хотите сохранить dtypes, даже категориальные, это быстрый способ сделать это:
источник
выходы:
источник