Python 如何洗牌此3D numpy阵列的前二维?
我正在开发一个程序,在这个程序中,我想显示一张图片并随机排列像素(然后,希望能将它们重新排序)。我找到了一个使用array3d将图像作为像素加载到3D数组(行、列、RGB值)的教程。numpy.random.shuffle()只洗牌顶部维度。有没有一种简单的方法可以像在同一维度中一样洗牌行和列(而不篡改第三维度的颜色值)Python 如何洗牌此3D numpy阵列的前二维?,python,arrays,numpy,pygame,Python,Arrays,Numpy,Pygame,我正在开发一个程序,在这个程序中,我想显示一张图片并随机排列像素(然后,希望能将它们重新排序)。我找到了一个使用array3d将图像作为像素加载到3D数组(行、列、RGB值)的教程。numpy.random.shuffle()只洗牌顶部维度。有没有一种简单的方法可以像在同一维度中一样洗牌行和列(而不篡改第三维度的颜色值) 导入pygame 将numpy作为np导入 pygame.init() image=pygame.image.load('smiley.png') #我们将操纵的像素。 像素=
导入pygame
将numpy作为np导入
pygame.init()
image=pygame.image.load('smiley.png')
#我们将操纵的像素。
像素=pygame.surfarray.array3d(图像)
#设置窗口
w、 h=像素。形状[0],像素。形状[1]
display_surface=pygame.display.set_模式((w,h))
尽管如此:
#将阵列绘制到屏幕上
pygame.surfarray.blit_数组(显示表面,像素)
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
pygame.quit()
退出
elif event.type==pygame.KEYDOWN:
如果event.key==pygame.K_:
#对像素进行置乱
np.random.shuffle(像素)
pygame.display.update()
我可以迭代每一行,然后自己对它们进行置乱,但实际上,我希望对每个x,y像素进行置乱,就好像它们是同一个数组一样。我是numpy的初学者。我可以将3D数组转换为2D数组,将其洗牌,然后再转换回3D数组吗?我是不是想得太多了?谢谢你的帮助 当我正确理解你时,你正在寻找这样的东西:
import numpy as np
# create an 3x3 array like your picture:
pixels= np.arange(27).reshape((3, 3, 3))
# shuffle dimension 2:
for i in range(0, pixels.shape[0]):
np.random.shuffle(pixels[i][:])
pixels= pixels.copy()
# shuffle dimension 1:
np.random.shuffle(pixels[:])
# output:
pixels
你试过类似的东西吗
np.random.shuffle(pixels)
np.random.shuffle(np.swapaxes(pixels, 0, 1))
pixels = np.reshape(np.random.shuffle(np.reshape(pixels, -1)), (w, h, -1))
??Shuffle已经就位,swapax返回一个视图,因此它应该按照您的描述工作。添加一个辅助答案,以便您可以选择。我相信这个可能会慢一些(但实际上在所有坐标中都是随机的) 如果出于某种原因,它是一个新对象而不是视图,则必须执行以下操作
np.random.shuffle(pixels)
np.random.shuffle(np.swapaxes(pixels, 0, 1))
pixels = np.reshape(np.random.shuffle(np.reshape(pixels, -1)), (w, h, -1))
相反。与我的结果相同,但效率可能更高:这看起来相当不错。它仍然会在像素上创建一个奇怪的网格状图案,但更接近我要实现的目标。非常感谢。是的,正如你所提到的,如果你按照描述的那样做,你仍然会得到一个网格状的模式。人类擅长探测这种东西=)。这是因为一次洗牌一个轴只会给你
w!啊代码>可能的结果,而不是(wh)代码>,这是一个相当大的减少。