2017-01-24 1 views
2

(n, n) 또는 (n, n, 1) 행렬을 (n, n, 3) 행렬로 변환하는보다 최적화 된 방법을 찾고 있습니다. 나는 (n, n, 3)으로 시작하지만, 두 번째 축에서 (n, n)으로 합계를 계산하면 치수가 줄어 듭니다. 기본적으로 배열의 원래 크기를 유지하고 두 번째 축을 방금 3 번 반복합니다. 내가 이것을 필요로하는 이유는 나중에 다른 (n, n, 3) 배열로 방송 할 것이지만 동일한 차원을 필요로하기 때문입니다.다른 차원의 배열을 함께 브로드 캐스팅

현재 방법이 작동하지만 우아하지 않습니다.

a0=np.random.random((n,n)) 
b=a.flatten().tolist() 
a=np.array(zip(b,b,b)) 
a.shape=n,n,3 

이 설정에는 원하는 결과가 있지만 따라하기가 어렵습니다. 두 번째 색인을 복제하여 (n, n)에서 (n, n, 3)으로 직접 이동하는 방법이 있습니까? 아니면 배열을 축소하지 않는 방법으로 시작할 것인가?

답변

1

당신은 첫째로 a에 새로운 축 (축 = 2) 만든 다음이 새로운 축을 따라 np.repeat를 사용할 수 있습니다 바꿀 다음,

np.repeat(a[:,:,None], 3, axis = 2) 

또는 다른 접근 방식 배열을 평평 요소를 반복 :

np.repeat(a.ravel(), 3).reshape(n,n,3) 

결과 비교 :

012,377,441,323,861,966,826 176,403,210

타이밍 내장 numpy.repeat 사용은 또한 속도를 보여준다

import numpy as np 
n = 4 
a=np.random.random((n,n)) 
​ 
def rep(): 
    b=a.flatten().tolist() 
    a1=np.array(zip(b,b,b)) 
    a1.shape=n,n,3 

%timeit rep() 
# 100000 loops, best of 3: 7.11 µs per loop 

%timeit np.repeat(a[:,:,None], 3, axis = 2) 
# 1000000 loops, best of 3: 1.64 µs per loop 

%timeit np.repeat(a.ravel(), 3).reshape(4,4,3) 
# 1000000 loops, best of 3: 1.9 µs per loop 
2

None 또는 np.newaxis 배열로 치수를 첨가하는 일반적인 방법이다. (3,3,1)와 reshape 마찬가지로 잘 작동 : 함수 나 방법으로

In [64]: arr=np.arange(9).reshape(3,3) 
In [65]: arr1 = arr[...,None] 
In [66]: arr1.shape 
Out[66]: (3, 3, 1) 

repeat이를 복제합니다.

In [72]: arr2=arr1.repeat(3,axis=2) 
In [73]: arr2.shape 
Out[73]: (3, 3, 3) 
In [74]: arr2[0,0,:] 
Out[74]: array([0, 0, 0]) 

하지만 그렇게하지 않아도됩니다. 방송과 함께 (3,3,1) 작품은 (3,3,3).

In [75]: (arr1+arr2).shape 
Out[75]: (3, 3, 3) 

실제로 (3,3)을 (3,3,3)으로 생성하여 방송합니다.

In [77]: arr1+np.ones(3,int) 
Out[77]: 
array([[[1, 1, 1], 
     [2, 2, 2], 
     ... 
     [[7, 7, 7], 
     [8, 8, 8], 
     [9, 9, 9]]]) 

그래서 arr1+np.zeros(3,int)은 (3,3,3-)에 그 (3,3,1)을 확장하는 또 다른 방법입니다.

방송 규칙은 필요에 따라

(3,3,1) + (3,) => (3,3,1) + (1,1,3) => (3,3,3) 

방송 시작에 치수를 추가합니다.

: 당신은 모든 사이즈에 따라 배열에서 평균을 빼려면

In [78]: arr2.sum(axis=2).shape 
Out[78]: (3, 3) 
In [79]: arr2.sum(axis=2, keepdims=True).shape 
Out[79]: (3, 3, 1) 

이 편리합니다 : 당신이 축에 요약하면, 당신이 매개 변수를 사용하여 차원의 원래 수를 유지할 수 있습니다

arr2-arr2.mean(axis=2, keepdims=True) 
관련 문제