복붙노트

[PYTHON] Numpy - 벡터 행이있는 행렬 만들기

PYTHON

Numpy - 벡터 행이있는 행렬 만들기

저는 벡터 [x, y, z, q]를 가지고 있고 행렬을 만들고 싶습니다 :

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

m 행. 나는 이것이 브로드 캐스팅을 사용하여 영리한 방법으로 수행 될 수 있다고 생각하지만, for 루프를 사용하여 생각할 수있다.

해결법

  1. ==============================

    1.기둥을 따라 m 제로를 추가 한 후 방송 할 수 있습니다.

    기둥을 따라 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.newaxis / None을 사용하여 차원을 확장 한 후 np.repeat를 사용할 수도 있습니다.

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

    정수 배열 인덱싱을 사용하여 복제본을 얻을 수도 있습니다 (예 :

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

    그리고 마지막으로 np.broadcast_to를 사용하면 입력 벡터에 2D 뷰를 생성 할 수 있습니다. 따라서 가상 메모리가 필요 없으며 추가 메모리가 필요하지 않습니다. 그래서, 우리는 간단히 -

    In [22]: np.broadcast_to(vector,(m,len(vector)))
    Out[22]: 
    array([[4, 5, 8, 2],
           [4, 5, 8, 2],
           [4, 5, 8, 2],
           [4, 5, 8, 2],
           [4, 5, 8, 2]])
    

    런타임 테스트 -

    다음은 다양한 접근 방식을 비교하는 빠른 런타임 테스트입니다.

    In [12]: vector = np.random.rand(10000)
    
    In [13]: m = 10000
    
    In [14]: %timeit np.broadcast_to(vector,(m,len(vector)))
    100000 loops, best of 3: 3.4 µs per loop # virtually free!
    
    In [15]: %timeit np.zeros((m,1),dtype=vector.dtype) + vector
    10 loops, best of 3: 95.1 ms per loop
    
    In [16]: %timeit np.tile(vector,(m,1))
    10 loops, best of 3: 89.7 ms per loop
    
    In [17]: %timeit np.repeat(vector[None],m,axis=0)
    10 loops, best of 3: 86.2 ms per loop
    
    In [18]: %timeit vector[None][np.zeros(m,dtype=int)]
    10 loops, best of 3: 89.8 ms per loop
    
  2. from https://stackoverflow.com/questions/33200625/numpy-create-matrix-with-rows-of-vector by cc-by-sa and MIT license