2013-11-27 12 views
6

Mam funkcję, która ma przyjmować tablicę 1D liczb całkowitych i kształtuje ją na tablicę 2D z tablicami 1x3. Następnie należy wziąć każdą tablicę 1x3 i przenieść ją do tablicy 3x1. Wynik ma być tablicą 2D z tablicami 3x1. Oto moja funkcja:Nie można zmienić kształtu tablicy numpy

Problem wzrasta, gdy próbuję zmienić tablice 1x3 na tablice 3x1. Mam następujący wynik zakładając 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) 

Jak mogę uniknąć tego błędu?

+1

Kiedy mówi 2D tablicy macierzy 1x3, to jest kształtu (n, n-1, 3)? Przykład tutaj może pomóc wyjaśnić! –

+1

Głównym problemem jest to, że każda pozycja 'lmsValues' ma już określony kształt, więc przypisanie jej do tego o innym kształcie jest niedozwolone. Zgadzam się z @AndyHayden, jednak prosty przykład danych wejściowych i oczekiwanych będzie pomocny w odpowiedzi na twoje pytanie. – cm2

+0

Edytowane, teraz powinno być bardziej zrozumiałe –

Odpowiedz

5

Jak wspomniano w komentarzach, tak naprawdę zawsze po prostu modyfikujesz jedną tablicę o różnych kształtach. W numpy nie ma sensu powiedzieć, że masz tablicę 2d z tablic 1 x 3. Tak naprawdę jest to tablica n x 3.

Zaczynamy 1d tablicy długości 3*n (Dodałem trzy numery na swoim przykładzie, aby różnica między 3 x n i n x 3 tablicy jasny):

>>> import numpy as np 

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

I przekształcić go za 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) 

Jeśli chcesz być każdy element w kształcie 3 x 1, może po prostu chcesz przenieść tablicę. Przełączniki to wiersze i kolumny, więc kształt jest 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,) 

Jeśli naprawdę chcesz każdy element w lmsValues się być 1 x 3 tablicę, można to zrobić, ale to musi być 3d tablica w kształcie 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

Naprawdę, tablica 2D z tablicami 1x3 byłaby macierzą 4D. Lub może to być tablica 2D typu "dtype = object", gdzie każdy element jest tablicą 2D 1x3. Obie są zdecydowanie wykonalne. Jednak żadna z nich nie wydaje się być niczym, co rzeczywiście chciałby OP; Myślę, że ta odpowiedź jest tym, co on faktycznie chce, nawet jeśli nie wie. – abarnert

+0

Haha, semantycznie, myślę, że masz rację, @abarnert, ale czy to nie oznaczałoby zmiany wielkości? Lub, przypuśćmy, że może to być '(n, 1, 1, 3)', lol. Ale tak, zgaduję, że to, do czego dąży, jest przeniesieniem. – askewchan

+0

Tak, bez zmiany rozmiaru, '(n, 1, 1, 3)'. Lub '(1, n, 1, 3)'. Czy nieuzasadnione jest podnoszenie każdego wymiaru jeden raz lub wyświetlanie tego samego wymiaru dwa razy pod rząd? To zależy od tego, co próbujesz zrobić, i nie mam pojęcia, dlaczego mówi, że chce tablicy 2D z tablicami 1x3. (Zwłaszcza, że ​​nie sądzę, że on tego chce, on chce tablicy 1D z tablicami 1x3, dokładnie tak, jak mu dałeś.) – abarnert