numpy 数组在一维中重新排序值

numpy array reorder values in single dimension

我还是 numpy 的新手,并且在编写 lambda 来执行本例中我想要的操作时遇到了问题。可能是因为数组中的数据导致 lambda 不起作用?

我使用 Python 中的 PyQT 从 Qt5 中的 QImage 获得了一些像素值:

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 调用而不是使用 lambda post 进程来执行此操作?

这些问题很有趣,但我仍然无法将它们粘合在一起以获得我想要的结果:

  • 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:

使用slicing

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

这个解决方案怎么样?您可以在通过此

发送之前使用 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)