Конечно можно с broadcasting
после добавления с m
нулями по столбцам, как так -
np.zeros((m,1),dtype=vector.dtype) + vector
Теперь NumPy уже имеет встроенные функции np.tile
именно для той же задачи -
np.tile(vector,(m,1))
Образец пробы -
In [496]: vector
Out[496]: array([4, 5, 8, 2])
In [497]: m = 5
In [498]: np.zeros((m,1),dtype=vector.dtype) + vector
Out[498]:
array([[4, 5, 8, 2],
[4, 5, 8, 2],
[4, 5, 8, 2],
[4, 5, 8, 2],
[4, 5, 8, 2]])
In [499]: np.tile(vector,(m,1))
Out[499]:
array([[4, 5, 8, 2],
[4, 5, 8, 2],
[4, 5, 8, 2],
[4, 5, 8, 2],
[4, 5, 8, 2]])
Вы также можете использовать np.repeat
после расширения его размера с np.newaxis/None
тем же эффектом, как и -
In [510]: np.repeat(vector[None],m,axis=0)
Out[510]:
array([[4, 5, 8, 2],
[4, 5, 8, 2],
[4, 5, 8, 2],
[4, 5, 8, 2],
[4, 5, 8, 2]])
Наконец, вы можете также использовать integer array indexing
, чтобы получить репликации, как так -
In [525]: vector[None][np.zeros(m,dtype=int)]
Out[525]:
array([[4, 5, 8, 2],
[4, 5, 8, 2],
[4, 5, 8, 2],
[4, 5, 8, 2],
[4, 5, 8, 2]])
Тест во время выполнения -
Вот быстрый тест времени выполнения, сравнивающий четыре подхода, перечисленные в сообщении ранее:
In [542]: vector = np.random.rand(100)
In [543]: m = 100
In [544]: %timeit np.zeros((m,1),dtype=vector.dtype) + vector
10000 loops, best of 3: 38.7 µs per loop
In [545]: %timeit np.tile(vector,(m,1))
10000 loops, best of 3: 22.5 µs per loop
In [546]: %timeit np.repeat(vector[None],m,axis=0)
100000 loops, best of 3: 15.7 µs per loop
In [547]: %timeit vector[None][np.zeros(m,dtype=int)]
1000 loops, best of 3: 209 µs per loop
Похоже, np.repeat
- это путь к успеху!