2013-11-27 2 views
6

1D 배열의 정수를 취해서 1x3 배열의 2D 배열로 모양을 지정하는 함수가 있습니다. 그런 다음 각 1x3 배열을 가져 와서 3x1 배열로 이동해야합니다. 결과는 3x1 배열의 2D 배열로 가정됩니다. 내 기능은 다음과 같습니다numpy 배열을 재구성 할 수 없습니다.

def RGBtoLMS(rgbValues, rgbLength): #Method to convert from RGB to LMS 
    print rgbValues 
    lmsValues = rgbValues.reshape(-1, 3) 
    print lmsValues 
    for i in xrange(len(lmsValues)): 
     lmsValues[i] = lmsValues[i].reshape(3, 1) 

    return lmsValues 

1x3 어레이를 3x1 어레이로 변경하려고하면 문제가 발생합니다. I는 rgbValues의 = [14, 25, 19, 24, 25, 28, 58, 87, 43]

[14 25 19 ..., 58 87 43] 
[[14 25 19] 
[24, 25, 28] 
[58 87 43]] 

ValueError [on line lmsValues[i] = lmsValues[i].reshape(3, 1)]: could not broadcast input array from shape (3,1) into shape (3) 

방법 I이 오류를 피할 수를 가정하여 다음 출력을 얻을?

+1

1x3 배열의 2D 배열은 shape (n, n, 1, 3)입니까? 예를 들면 명확히하는 데 도움이 될 수 있습니다! –

+1

주요한 이슈는'lmsValues'의 각 엔트리가 이미 지정된 쉐이프를 가지고 있기 때문에, 다른 쉐이프로 뭔가를 할당하는 것이 허용되지 않는다는 것입니다. 그러나 @AndyHayden에 동의합니다. 귀하의 의견과 예상되는 결과의 간단한 예가 귀하의 질문에 도움이 될 것입니다. – cm2

+0

수정되었습니다. 이제 더 명확해야합니다. –

답변

5

의견에서 언급했듯이 실제로는 항상 하나의 배열을 다른 모양으로 수정하는 것입니다. 1 x 3 배열의 2 차원 배열이 있다고 말하는 것은 실제로 numpy에서는 의미가 없습니다. 실제로 그 배열은 실제로 n x 3 배열입니다.

>>> import numpy as np 

>>> rgbValues = np.array([14, 25, 19, 24, 25, 28, 58, 87, 43, 1, 2, 3]) 
>>> rgbValues.shape 
(12,) 

그리고 n x 3 수를 바꿀 :

우리는 길이 3*n (내가 지우면 3 x nn x 3 배열의 차이를 확인하기 위해 예에 세 개의 숫자를 추가 한)의 1 차원 배열로 시작 :

>>> lmsValues = rgbValues.reshape(-1, 3) 
>>> lmsValues 
array([[14, 25, 19], 
     [24, 25, 28], 
     [58, 87, 43], 
     [ 1, 2, 3]]) 
>>> lmsValues.shape 
(4, 3) 

각 요소가 3 x 1 모양을 받으려면

는, 어쩌면 당신은 배열을 전치하고 싶다. 당신이 진정으로 1 x 3 배열로 각 요소 lmsValues에서을 원하는 경우 모양이 3 x n

>>> lmsValues.T 
array([[14, 24, 58, 1], 
     [25, 25, 87, 2], 
     [19, 28, 43, 3]]) 

>>> lmsValues.T.shape 
(3, 4) 

>>> lmsValues.T[0] 
array([14, 24, 58, 1]) 

>>> lmsValues.T[0].shape 
(4,) 

그래서 이것은 당신이 그렇게 할 수있는, 행과 열을 전환하지만, 그것은 형상의 3 차원 배열이어야한다 n x 1 x 3 :

+1

실제로, 1x3 배열의 2D 배열은 4D 배열이됩니다. 또는 각 요소가 2D 1x3 배열 인'dtype = object'의 2D 배열 일 수 있습니다. 둘 다 분명히 할 수 있습니다. 그러나 어느 누구도 OP가 실제로 원하는 것처럼 보이지 않습니다. 나는이 대답이 그가 그것을 모른다 할지라도 그가 실제로 바라는 것이라고 생각한다. – abarnert

+0

하하, 의미상으로 말하면, 당신이 옳다고 생각합니다.하지만, 사이즈 변경이 필요하지 않습니까? 아니면'(n, 1, 1, 3)'이 될 수 있다고 생각합니다. 하지만 그래, 제 생각에 트랜스 포스는 그가 한 일입니다. – askewchan

+0

예, 크기를 변경하지 않고'(n, 1, 1, 3)'. 또는'(1, n, 1, 3)'. 각 측정 기준을 한 번 올리거나 동일한 측정 기준을 두 번 나열하는 것이 더 불합리한 것입니까? 그것은 당신이하려는 일에 달려 있습니다. 왜 그가 1x3 배열의 2D 배열을 원한다고 생각하는지 모르겠습니다. (특히 나는 그가 실제로 그것을 원한다고 생각하지 않기 때문에, 그가 당신에게 준 것과 똑같은 1x3 배열의 1D 배열을 원한다.) – abarnert

관련 문제