2016-06-12 3 views
3

최근에 질문 한대로 답변 한 here을 게시했습니다. 그러나 나는 대답을 더 잘 조작 할 수있는 능력을 과대 평가했다고 생각한다. 나는 방송 문서를 읽고, numpy 방송에 관해 2002 년으로 돌아 갔던 몇 개의 링크를 따라 갔다.Numpy Broadcasting에 대한 설명 응답

N = 10 
out = np.zeros((N**3,4),dtype=int) 
out[:,:3] = (np.arange(N**3)[:,None]/[N**2,N,1])%N 

출력 :

제가 broadcasting을 사용하여 배열을 생성 번째 방법 사용한

[[0,0,0,0] 
[0,0,1,0] 
... 
[0,1,0,0] 
[0,1,1,0] 
... 
[9,9,8,0] 
[9,9,9,0]] 

를하지만 그 조작 방법 문서를 통해 이해하지 않는다. 각 개별 열이 변경되는 증분을 설정하는 것이 이상적입니다.

ex. 2 0.5 A 열에 의해 변화 1 0.2 B 열 변경 및 도움 10.

[[0,0,0,0] 
[0,0,1,0] 
... 
[0,0,9,0] 
[0,0.2,0,0] 
... 
[0,0.8,9,0] 
[0.5,0,0,0] 
... 
[1.5,0.8,9,0]] 

감사까지 1 씩 열 C 변한다.

답변

4

현재 코드를 약간만 조정하여 작동되게 할 수 있습니다.

>>> out = np.zeros((4*5*10,4)) 
>>> out[:,:3] = (np.arange(4*5*10)[:,None]//(5*10, 10, 1)*(0.5, 0.2, 1)%(2, 1, 10)) 
>>> out 
array([[ 0. , 0. , 0. , 0. ], 
     [ 0. , 0. , 1. , 0. ], 
     [ 0. , 0. , 2. , 0. ], 
     ... 
     [ 0. , 0. , 8. , 0. ], 
     [ 0. , 0. , 9. , 0. ], 
     [ 0. , 0.2, 0. , 0. ], 
     ... 
     [ 0. , 0.8, 9. , 0. ], 
     [ 0.5, 0. , 0. , 0. ], 
     ... 
     [ 1.5, 0.8, 9. , 0. ]]) 

변경은 다음과 같습니다

  1. 배열 없음 int DTYPE, 우리가 그것을 필요로하기 때문에 일부 열 수레를 개최. 원하는 경우 float dtype을 지정할 수 있습니다 (또는 처음 두 열에서만 부동을 허용하는 복잡한 경우).
  2. N**3 총 값이 아니라 각 열의 고유 값 수를 계산하고이를 곱하여 총 크기를 얻으십시오. 이 값은 zerosarange에 모두 사용됩니다.
  3. 첫 번째 브로드 캐스트 작업에서 floor division // 연산자를 사용하십시오.이 시점에서 정수를 원하지만 나중에는 float을 원할 것입니다.
  4. 다시 나누는 값은 나중에 열의 값 수를 기준으로합니다 (예 : A,B,C 값 수는 B*C, C, 1으로 나눕니다).
  5. 다양한 배율 인수 (각 값이 한 번에 증가하는 정도)를 곱하여 새 브로드 캐스트 작업을 추가합니다.
  6. 브로드 캐스트 모드 % 작업의 값을 각 열의 경계와 일치하도록 변경하십시오.
3

이 작은 예는 나에게 무슨 일이 일어나고 있는지 이해하는 데 도움이 :

In [123]: N=2  
In [124]: np.arange(N**3)[:,None]/[N**2, N, 1] 
Out[124]: 
array([[ 0. , 0. , 0. ], 
     [ 0.25, 0.5 , 1. ], 
     [ 0.5 , 1. , 2. ], 
     [ 0.75, 1.5 , 3. ], 
     [ 1. , 2. , 4. ], 
     [ 1.25, 2.5 , 5. ], 
     [ 1.5 , 3. , 6. ], 
     [ 1.75, 3.5 , 7. ]]) 

그래서 우리는 숫자의 범위 (7-0)를 생성하고 4,2, 그리고 1을 나눕니다.

:

은 계산의 나머지는 그냥 추가로 int 배열에 할당 각 요소

In [126]: np.arange(N**3)[:,None]/[N**2, N, 1]%N 
Out[126]: 
array([[ 0. , 0. , 0. ], 
     [ 0.25, 0.5 , 1. ], 
     [ 0.5 , 1. , 0. ], 
     [ 0.75, 1.5 , 1. ], 
     [ 1. , 0. , 0. ], 
     [ 1.25, 0.5 , 1. ], 
     [ 1.5 , 1. , 0. ], 
     [ 1.75, 1.5 , 1. ]]) 

%N 적용

를 방송하지 않고 각각의 값을 변경

정수로 플로트 변환과 동일

In [127]: (np.arange(N**3)[:,None]/[N**2, N, 1]%N).astype(int) 
Out[127]: 
array([[0, 0, 0], 
     [0, 0, 1], 
     [0, 1, 0], 
     [0, 1, 1], 
     [1, 0, 0], 
     [1, 0, 1], 
     [1, 1, 0], 
     [1, 1, 1]])