Как сгенерировать массив с повторяющимися строками 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 шт):

Автор решения: passant

В общем, пока ТС так и не разобрался, что и как он генерирует, приведу пример того, как можно дублировать одну строку массива "вниз", превратив массив в матрицу, или один столбец "вправо", превратив его тоже в матрицу. Не уверен, что это то, чего хочет ТС, но за неимением вразумительного пояснения или примера - может кому пригодится. (Разумеется, размерность будет "игрушечная", что-бы видеть, что происходит). Итак имеем начальный одномерный массив:

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]]

Имеем две транспонированые матрицы, как ТС и просил.

→ Ссылка