2017-04-06 1 views
1

배열을 슬라이스하여 임의의 다른 배열로 조작 할 수 있도록하고 싶습니다. 즉, 내가 뭐하는 거지 다음필요에 따라 np.newaxis를 덧붙입니다.

A = np.random.rand(5) 
B = np.random.rand(5,2,3,4) 
slicer = [slice(None)] + [None]*(len(B.shape)-1) 
result = B*A[slicer] 

내가 slicer를 구성 할 필요가 없도록 사용할 수있는 몇 가지 구문이 있습니까?

+0

모양 변경이 하나의 옵션이 될 수있는 또한 일반적인 경우이 아니다'B * A.reshape (A.shape + (1) * (B.ndim-1))',하지만 본질적으로 동일합니다. – Divakar

+0

당신의 코드는'expand_dims'가 내부적으로 무엇을하는지 생각 나게합니다. 방송 기본값은 다른 방향으로 확장됩니다. 자신의 함수에서이 액션을 감싸는 것이 가장 간단하다. – hpaulj

답변

3

이 경우에는 np.einsum에 줄임표를 사용할 수 있습니다.

result2 = np.einsum('i,i...->i...', A, B) 

np.allclose(result, result2) 

Out[232]: True 

@hpaulj가 지적한대로 (당신이 1/B를 사용하는 경우 또는 부서)이 만 곱셈 작동,하지만.

방송이 상대방에서 정상적으로 작동하므로 np.transpose 축을 올바른 순서로 두 번 가져올 수 있습니다.

result3 = np.transpose(np.transpose(B) * A) 

그러나

+0

좋지만 곱셈으로 제한됩니다. – hpaulj

관련 문제