2013-11-27 15 views
6

Ho una funzione che dovrebbe acquisire una matrice 1D di numeri interi e la forma in una matrice 2D di array 1x3. Quindi si suppone che prenda ciascun array 1x3 e lo sposti in un array 3x1. Il risultato dovrebbe essere un array 2D di array 3x1. Qui è la mia funzioneImpossibile rimodellare l'array 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 

Il problema sorge quando si tenta di cambiare le matrici 1x3 per le matrici 3x1. Ottengo il seguente output assumendo 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) 

Come posso evitare questo errore?

+1

Quando si dice matrice 2D di array 1x3, è di forma (n, n, 1, 3)? Un esempio qui potrebbe aiutare a chiarire! –

+1

Il problema principale è che ogni voce di 'lmsValues' ha già una forma specificata, quindi non è consentito assegnare qualcosa a questa con una forma diversa. Sono d'accordo con @AndyHayden, tuttavia, che un semplice esempio del tuo input e l'output atteso saranno utili per rispondere alla tua domanda. – cm2

+0

Modificato, ora dovrebbe essere più chiaro –

risposta

5

Come menzionato nei commenti, in realtà si modifica sempre un array con forme diverse. Non ha senso in numpy dire che hai una matrice 2d di array 1 x 3. Quello che realmente è in realtà è un array n x 3.

si comincia con una serie 1D di lunghezza 3*n (Ho aggiunto tre numeri per il vostro esempio a fare la differenza tra un 3 x n e n x 3 matrice chiara):

>>> import numpy as np 

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

e rimodellare per essere n x 3:

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

Se si desidera che ogni elemento di essere plasmato 3 x 1, forse volete solo per trasporre la matrice. Questo interruttori righe e colonne, per cui la forma è 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,) 

Se si desidera allineare ciascun elemento in lmsValues ad essere una matrice 1 x 3, si può fare, ma poi deve essere una matrice 3d con forma n x 1 x 3:

>>> lmsValues = rgbValues.reshape(-1, 1, 3) 
>>> lmsValues 
array([[[14, 25, 19]], 

     [[24, 25, 28]], 

     [[58, 87, 43]], 

     [[ 1, 2, 3]]]) 

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

>>> lmsValues[0] 
array([[14, 25, 19]]) 

>>> lmsValues[0].shape 
(1, 3) 
+1

In realtà, un array 2D di array 1x3 sarebbe un array 4D. Oppure potrebbe essere un array 2D di 'dtype = object' dove ogni elemento è un array 1x3 2D. Entrambi sono sicuramente fattibili. Ma nessuno dei due sembra qualcosa che l'OP vorrebbe realmente fare; Penso che questa risposta sia ciò che in realtà vuole, anche se non lo sa. – abarnert

+0

Haha, semanticamente, penso che tu abbia ragione, @abarnert, ma non implicherebbe un cambiamento di taglia? Oppure, suppongo che potrebbe essere '(n, 1, 1, 3)', lol. Ma sì, la mia ipotesi è che la trasposizione è ciò che cerca. – askewchan

+0

Sì, senza ridimensionamento, '(n, 1, 1, 3)'. Oppure '(1, n, 1, 3)'. È più irragionevole sollevare ogni dimensione una volta o elencare la stessa dimensione due volte di seguito? Dipende da cosa stai cercando di fare, e non ho idea del perché dice che vuole un array 2D di array 1x3. (Soprattutto perché non credo che lo voglia davvero, vuole un array 1D di array 1x3, esattamente come gli hai dato.) – abarnert