2015-10-18 6 views
2

У меня есть вектор [x,y,z,q], и я хочу, чтобы создать матрицу:Numpy - создать матрицу строк вектора

[[x,y,z,q], 
[x,y,z,q], 
[x,y,z,q], 
... 
[x,y,z,q]] 

с т строк. Я думаю, что это можно сделать каким-то умным способом, используя трансляцию, но я могу думать только об этом с циклом for.

ответ

2

Конечно можно с 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 - это путь к успеху!

Смежные вопросы