Próbuję napisać funkcję Pythona, która zajmie tablicę 1D wartości RGB i wykonać listę tablic 3x1, które reprezentują piksele. Oto moja funkcja

def RGBtoLMS(rgbValues, rgbLength): #Passing in a list of rgbValues and an int representing the length of that list
    pixel = numpy.empty((3, 1), int)
    allPixels = list()
    x = 0
    for h in xrange(rgbLength):
        for i in xrange(len(pixel)):
            for j in xrange(len(pixel[i])):
                if x < rgbLength: #For some reason, x reaches rgbLength...
                    pixel[i][j] = rgbValues[x]
                    x+=1
        allPixels.append(pixel)
        for pixel in allPixels:
            print pixel

Kiedy uruchomię ten kod, zauważam, że przy każdej iteracji moich pętli, zamiast dodawać każdy piksel na końcu listy, ponieważ utworzona jest tablica 3x1, zastępuje wszystkie wartości na liście z najnowszym pikselem. Efekt końcowy to lista tak długo, jak długość mojej tablicy 1D posiadającej oryginalne wartości RGB, ale wszystkie elementy na liście są tablicą 3x1 ostatnich wartości RGB. Czy jest też sposób, w jaki mogę to napisać, więc nie potrzebuję tego, jeśli stwierdzenie? Potrzebuję go tylko dlatego, że x osiąga rgblength, nawet jeśli w przypadku pętli w Pythonie są (włącznie, wyłączne)

0
Nick Gilbert 27 listopad 2013, 23:35

2 odpowiedzi

Najlepsza odpowiedź

Możesz być zainteresowany Funkcja zmienia się ponownie zadanie dla Ciebie.

Na przykład:

import numpy
A = numpy.array( [1,2,3,101,102,103,4,5,6,104,105,106] )
B = A.reshape( (-1,3) )
print B

Wydruki:

[[  1   2   3]
 [101 102 103]
 [  4   5   6]
 [104 105 106]]
4
Peter de Rivaz 27 listopad 2013, 19:47

Po prostu pokażę dlaczego twój kod nie działa. Odpowiedź @Peter de Rivaz powinna być tym, co powinieneś zrobić w numpy

Kiedy allPixels.append(pixel), dołączasz częstość występowania pixel. Jeśli zmienisz wartość pixel później, cała częstość występowania pixel zmienia się. Zobacz ten przykład:

>>> def RGBtoLMS(rgbValues, rgbLength): #Passing in a list of rgbValues and an int representing the length of that list
    pixel = numpy.empty((3, 1), int)
    allPixels = list()
    x = 0
    for h in xrange(rgbLength/3):
        for i in xrange(len(pixel)):
            for j in xrange(len(pixel[i])):
                if x < rgbLength: #For some reason, x reaches rgbLength...
                    pixel[i][j] = rgbValues[x]
                    x+=1
        allPixels.append(pixel)
    for pixel in allPixels:
        print pixel, id(pixel)


>>> RGBtoLMS([1,2,3,101,102,103,4,5,6,104,105,106],12)
[[104]
 [105]
 [106]] 38693552
[[104]
 [105]
 [106]] 38693552
[[104]
 [105]
 [106]] 38693552
[[104]
 [105]
 [106]] 38693552

Więc możesz zrobić kilka rzeczy, aby uzyskać zamierzone zachowanie:

>>> def RGBtoLMS(rgbValues, rgbLength): #Passing in a list of rgbValues and an int representing the length of that list
    pixel = numpy.empty((3, 1), int)
    allPixels = list()
    x = 0
    for h in xrange(rgbLength/3):
        for i in xrange(len(pixel)):
            for j in xrange(len(pixel[i])):
                if x < rgbLength: #For some reason, x reaches rgbLength...
                    pixel[i][j] = rgbValues[x]
                    x+=1
        allPixels.append(pixel*1)
    for pixel in allPixels:
        print pixel, id(pixel)


>>> RGBtoLMS([1,2,3,101,102,103,4,5,6,104,105,106],12)
[[1]
 [2]
 [3]] 38301608
[[101]
 [102]
 [103]] 37756712
[[4]
 [5]
 [6]] 37949360
[[104]
 [105]
 [106]] 38399424

Lub przesuwając definicję pixel do pętli.

>>> def RGBtoLMS(rgbValues, rgbLength): #Passing in a list of rgbValues and an int representing the length of that list
    allPixels = list()
    x = 0
    for h in xrange(rgbLength):
        if x < rgbLength: #For some reason, x reaches rgbLength...
            pixel = numpy.empty((3, 1), int)
            for i in xrange(len(pixel)):
                for j in xrange(len(pixel[i])):
                    pixel[i][j] = rgbValues[x]
                    x+=1
            allPixels.append(pixel)
        else:
        break
    for pixel in allPixels:
        print pixel, id(pixel)


>>> RGBtoLMS([1,2,3,101,102,103,4,5,6,104,105,106],12)
[[1]
 [2]
 [3]] 38301608
[[101]
 [102]
 [103]] 37756712
[[4]
 [5]
 [6]] 37949360
[[104]
 [105]
 [106]] 38399424
3
CT Zhu 27 listopad 2013, 20:18