2017-02-01 1 views
1

이것은 아마도 매우 간단한 질문 일뿐입니다.2d numpy 배열로 1d numpy 배열을 브로드 캐스팅

A = [[2,4],[6,8][10,12]] 
    B = [1,2,4] 

나는 결과 배열 B에 의해 어레이 A를 나누고 싶은 :

는 I 모양 (3,2)로하는 2 차원 NumPy와 배열 및 형상의 1 차원 어레이 (3)가 에서 :

[[2,4],[3,4][2.5,3]] 

그러나 numpy는 내게 이것을 허용하지 않을 것입니다. 모양이 올바르지 않기 때문에 생각합니다. 익숙한 '피연산자가 모양 (10,2) (10,) 오류와 함께 방송 될 수 없습니다.'오류가 발생합니다.

나는 모양과 swapaxis와 함께 일을 시도했지만 작동하지 않습니다. 나는 for 루프를 사용하지 않고이 작업을 수행 할 수있는 것을 선호한다. 왜냐하면 배열을 축으로 교환해야 할 필요가 없기 때문이다 (다른 배열은이 모양이기 때문에).

나를 도와 줄 수 있습니까?

+0

np.reshape ([1,2,4], (3,1))'을 (를) 사용해 보셨습니까? A (10,) 배열은 (1,10)에서 (2,10)까지 방송 할 수 있습니다. 그러나 반대쪽에 측정 기준을 추가하려면 명시 적 조치가 필요합니다. – hpaulj

+0

[일반 방송 규칙] (https://docs.scipy.org/doc/numpy/user/basics.broadcasting.html#general-broadcasting-rules) – wwii

답변

1

2DB을 확장하고 분할 -

A/B[:,None].astype(float) 

샘플 실행 -

In [9]: A 
Out[9]: 
array([[ 2, 4], 
     [ 6, 8], 
     [10, 12]]) 

In [10]: B 
Out[10]: array([1, 2, 4]) 

In [11]: A/B[:,None].astype(float) 
Out[11]: 
array([[ 2. , 4. ], 
     [ 3. , 4. ], 
     [ 2.5, 3. ]]) 

또는 부동 PT 배열 발생하는 부문을 담당 from __future__ import division를 사용 -

In [14]: from __future__ import division 

In [15]: A/B[:,None] 
Out[15]: 
array([[ 2. , 4. ], 
     [ 3. , 4. ], 
     [ 2.5, 3. ]]) 

상호에 의해 곱셈과 1,363,210

성능 향상 -이에

In [32]: A = np.random.rand(300,200) 

In [33]: B = np.random.rand(300) 

In [34]: from __future__ import division 

In [35]: %timeit A/B[:,None] 
1000 loops, best of 3: 336 µs per loop 

In [36]: %timeit A*(1.0/B[:,None]) 
10000 loops, best of 3: 101 µs per loop 

더 많은 정보는 here를 볼 수 있습니다. 또한 B의 값이 0에 매우 가까우면이 방법을 사용할 때주의해야합니다.

+0

정말 대단합니다, 정말 고마워요! 작업 완료 – user90465

관련 문제