我正在开发一个程序,在这个程序中,我想要显示一张图片,并对像素进行随机化(然后,希望将它们排序回原位)。我找到一个教程,它使用array3d将图像作为像素加载到3D数组中(行、列、RGB值)。numpy.random.shuffle()仅对顶部维度进行置乱。有没有一种简单的方法可以同时处理行和列,就像它们在同一维中一样(而不会篡改第三维,即颜色值)?
import pygame
import numpy as np
pygame.init()
image = pygame.image.load('smiley.png')
# The pixels we will manipulate.
pixels = pygame.surfarray.array3d(image)
# Set up window
w, h = pixels.shape[0], pixels.shape[1]
display_surface = pygame.display.set_mode((w, h))
while True:
# Draw array onto screen
pygame.surfarray.blit_array(display_surface, pixels)
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
quit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_s:
# Scramble the pixels
np.random.shuffle(pixels)
pygame.display.update()我可以遍历每一行,并对它们进行置乱,但实际上,我希望对每个x,y像素进行置乱,就好像它们是同一个数组一样。我是numpy的初学者。我可以将3D数组转置为2D数组,对其进行混洗,然后再转置回3D数组吗?我是不是想多了?谢谢你的帮忙!
发布于 2019-12-03 13:47:05
你试过像这样的东西吗?
np.random.shuffle(pixels)
np.random.shuffle(np.swapaxes(pixels, 0, 1))?Shuffle是就地的,并且swapaxes返回一个视图,因此它的功能应该如您所描述的那样。
发布于 2019-12-03 13:39:38
如果我没理解错的话,你要找的东西是:
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发布于 2019-12-03 14:44:17
添加第二个答案,以便您可以选择。我认为这个可能更慢(但实际上在所有坐标中是随机的)。
np.random.shuffle(np.reshape(pixels, -1))如果出于某种原因,它是一个新对象而不是视图,则必须执行以下操作
pixels = np.reshape(np.random.shuffle(np.reshape(pixels, -1)), (w, h, -1))而不是。
https://stackoverflow.com/questions/59150496
复制相似问题