我如何洗牌这个三维numpy数组的前两个维度?

2024-04-19 06:28:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个程序,在这个程序中,我想显示一张图片,并将像素随机排列(然后,希望能将它们重新排序到位)。我发现了一个教程,它使用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数组?我是不是想得太多了?谢谢你的帮助!你知道吗


Tags: imageimport程序numpyeventdisplaynprandom
3条回答

你试过类似的东西吗

np.random.shuffle(pixels)
np.random.shuffle(np.swapaxes(pixels, 0, 1))

什么?Shuffle已经就绪,swapaxes返回一个视图,因此它应该按照您所描述的那样工作。你知道吗

添加辅助答案,以便您可以选择。我相信这个可能比较慢(但实际上在所有坐标中都是随机的)。你知道吗

np.random.shuffle(np.reshape(pixels, -1))

如果出于某种原因,它是一个新对象而不是一个视图,则必须执行以下操作

pixels = np.reshape(np.random.shuffle(np.reshape(pixels, -1)), (w, h, -1))

相反。你知道吗

当我正确理解你时,你在寻找这样的东西:

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

相关问题 更多 >