Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何洗牌此3D numpy阵列的前二维?_Python_Arrays_Numpy_Pygame - Fatal编程技术网

Python 如何洗牌此3D numpy阵列的前二维?

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') #我们将操纵的像素。 像素=

我正在开发一个程序,在这个程序中,我想显示一张图片并随机排列像素(然后,希望能将它们重新排序)。我找到了一个使用array3d将图像作为像素加载到3D数组(行、列、RGB值)的教程。numpy.random.shuffle()只洗牌顶部维度。有没有一种简单的方法可以像在同一维度中一样洗牌行和列(而不篡改第三维度的颜色值)

导入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),这是一个相当大的减少。