значения переупорядочения массива numpy в одномерном измерении

Я все еще новичок в numpy, и у меня проблемы с написанием лямбда-выражения, чтобы делать то, что я хочу в этом случае. Может быть, лямбда не работает из-за данных в массиве?

У меня есть несколько значений пикселей из QImage в Qt5, используя PyQT в Python:

ptr = self.myPhoto.bits()
ptr.setsize(self.myPhoto.byteCount())
pixels = np.asarray(ptr).reshape(self.myPhoto.height(), self.myPhoto.width(), 4)

Данные пикселей выглядят так [[[B G R A]]]:

[[[  100   0   2 255]
  [  100   0   2 255]
  [  100   1   1 255]
  ..., 
  [  2   3   0 255]
  [  1   2   0 255]
  [  1   2   0 255]]]

Я хочу, чтобы это выглядело так [[[R G B A]]]:

[[[  2   0 100 255]
  [  2   0 100 255]
  [  1   1 100 255]
  ..., 
  [  0   3   2 255]
  [  0   2   1 255]
  [  0   2   1 255]]]

РЕДАКТИРОВАТЬ: из массива удалены запятые

Кроме того, можно ли сделать это прямо из вызова reshape вместо использования пост-процесса лямбда?

Эти вопросы интересны, но мне все еще трудно склеить их вместе, чтобы получить то, что я хочу:


person delrocco    schedule 24.01.2018    source источник


Ответы (2)


  • PyQt:

Одно из возможных решений - использовать rgbSwapped (), этот метод преобразует RGB в BGR:

self.myPhoto = self.myPhoto.rgbSwapped()
ptr = self.myPhoto.bits()
ptr.setsize(self.myPhoto.byteCount())
pixels = np.asarray(ptr).reshape(self.myPhoto.height(), self.myPhoto.width(), 4)
  • Использование Numpy:

используя нарезку

ptr = self.myPhoto.bits()
ptr.setsize(self.myPhoto.byteCount())
pixels = np.asarray(ptr).reshape(self.myPhoto.height(), self.myPhoto.width(), 4)

r = np.copy(pixels[:,:,0])
pixels[:, :, 0] = pixels[:,:,2]
pixels[:, :, 2] = r
person eyllanesc    schedule 24.01.2018
comment
Re: PyQT - это фактически дает мне то, что я хочу, но я должен продублировать объект, верно? Потому что я не могу потерять исходное изображение RGB. - person delrocco; 25.01.2018
comment
@delrocco Тогда скопируйте его на другое изображение, я обновлю свой ответ. : D - person eyllanesc; 25.01.2018
comment
лол нет, я это понимаю. Я имею в виду, что слабость этого решения в том, что мне нужно дублировать память для него. Это все, что я имел в виду. Но я смотрю на ваше новое решение. - person delrocco; 25.01.2018
comment
@delrocco Нет, в моем первоначальном решении память не дублировалась, так как она заменяла предыдущее пространство памяти. С другой стороны, я понял вас из вашего первоначального комментария, что вы не хотите терять исходное изображение. - person eyllanesc; 25.01.2018
comment
Ваше второе решение открыло мне глаза на кое-что еще! Я думал, что numpy копирует пиксели из указателя в биты QImage. Но когда я манипулирую этим массивом пикселей, это напрямую влияет на мой исходный QImage. Итак ... мне все равно придется дублировать память, потому что мне нужны оба набора: / - person delrocco; 25.01.2018
comment
@delrocco Точно, если вы хотите управлять скоростью, наиболее распространенная вещь, которую делают библиотеки, - это не обмен значениями, а позициями в памяти, переместить переменную дешевле, чем их сотни или тысячи. - person eyllanesc; 25.01.2018
comment
Ну конечно; естественно. просто недопонимание с моей стороны массива numpy, так как я новичок в этом. но спасибо за оба решения. Я просто продублировал массив numpy вместо QImage, который оказался намного быстрее, а затем сделал нарезку списка. - person delrocco; 25.01.2018
comment
@delrocco Много раз вам придется решать: потребление памяти или скорость, поэтому в следующих вопросах четко скажите, чего вы хотите. - person eyllanesc; 25.01.2018

Как насчет этого решения? вы можете использовать tolist () перед отправкой через это

order = [1,0,2,3]
test = [[[100,0,2,255],
  [100,0,2,255],
  [100,1,1,255]]]

print(test)

for i in range(0,len(test)):
    for j in range(0,len(test[i])):
        temp = test[i][j]
        temp = [temp[k] for k in order]
        test[i][j] = temp

print(test)
person Tyler Cowan    schedule 24.01.2018
comment
Я начал это делать, но решил, что это наивное решение. Будет ли лямбда лучше / быстрее? Или это сработает так же быстро? - person delrocco; 25.01.2018
comment
Я считаю, что лямбда быстрее, но если вы не обрабатываете большие массивы в миллионы, я бы не подумал так медленно, что вы не сможете его использовать. Я бы попробовал и посмотрю, довольны ли вы скоростью, а затем выясню лямбду позже. Я думаю, что быстрее, если говорить о миллисекундах, я уверен, что кто-то, кто захочет протестировать, вмешается. - person Tyler Cowan; 25.01.2018
comment
Хорошо, я вернусь к этому. Я работаю с HDR-изображениями 4368x2912, и пользователь может пролистывать их так быстро, как колесо мыши, поэтому мне бы хотелось, чтобы это было как можно быстрее. Но я попробую. - person delrocco; 25.01.2018
comment
Это может помочь вам определить производительность benjaminmgross.com/ - person Tyler Cowan; 25.01.2018
comment
определить order перед циклом, вы создаете эту переменную без необходимости на каждой итерации. - person eyllanesc; 25.01.2018