Как сгенерировать массив с повторяющимися строками Python
Имеется одномерный массив чисел (длина 2*10**6). Прошу прощение за наглость, но существует ли более быстрый способ сгенерировать два массива, чтобы в одном массиве каждая горизонтальная строка массива повторяла элементы исходного одномерного массива. Во втором массиве вертикальные столбцы должны повторять исходный одномерный массив. Получается два транспонированных массива. Индексирование или транспонирование у меня получается медленнее. В примере использован более короткий массив.
import numpy as np
import time
N = 2*10**6
m_0 = np.arange(N)
t1 = time.time()
m_1 = np.tile(m_0, N)
m_2 = np.repeat(m_0, N)
print(time.time() - t1)
print(m_1)
print(m_2)
Ответы (1 шт):
В общем, пока ТС так и не разобрался, что и как он генерирует, приведу пример того, как можно дублировать одну строку массива "вниз", превратив массив в матрицу, или один столбец "вправо", превратив его тоже в матрицу. Не уверен, что это то, чего хочет ТС, но за неимением вразумительного пояснения или примера - может кому пригодится. (Разумеется, размерность будет "игрушечная", что-бы видеть, что происходит). Итак имеем начальный одномерный массив:
m_0 = np.arange(5)
Выглядит от так:
array([0, 1, 2, 3, 4])
Создаем его копию:
m_01=m_0[:]
и "растягиваем" исходный массив "вниз":
for i in range(4):
m_01=np.vstack((m_01, m_0))
print (m_01)
Результат:
[[0 1 2 3 4]
[0 1 2 3 4]
[0 1 2 3 4]
[0 1 2 3 4]
[0 1 2 3 4]]
Теперь займемся растяжкой вправо:
Превращаем исходную строку в одномерный вектор:
m_2=m_0[:,np.newaxis]
и растягиваем его "вправо"
m_21=m_2[:]
for i in range(4):
m_21=np.hstack((m_21, m_2))
print (m_21)
Результат:
[[0 0 0 0 0]
[1 1 1 1 1]
[2 2 2 2 2]
[3 3 3 3 3]
[4 4 4 4 4]]
Имеем две транспонированые матрицы, как ТС и просил.