我正在尝试对图像中的所有像素进行加扰,而我的Knuths shuffle(以及其他人的)的实现似乎失败了。似乎它正在做每行。我无法理解为什么 - 只是看不到它。
以下是发生的事情:
哪个不是很拼凑!好吧,它可能更多的是刮削,需要更多的刮削。
这是我的代码:
import Image
from numpy import *
file1 = "lhooq"
file2 = "kandinsky"
def shuffle(ary):
a=len(ary)
b=a-1
for d in range(b,0,-1):
e=random.randint(0,d)
ary[d],ary[e]=ary[e],ary[d]
return ary
for filename in [file1, file2]:
fid = open(filename+".jpg", 'r')
im = Image.open(fid)
data = array(im)
# turn into array
shape = data.shape
data = data.reshape((shape[0]*shape[1],shape[2]))
# Knuth Shuffle
data = shuffle(data)
data = data.reshape(shape)
imout = Image.fromarray(data)
imout.show()
fid.close()
答案 0 :(得分:1)
当ary
是2D数组时,ary[d]
是该数组的视图,而不是内容的副本。
因此,ary[d],ary[e]=ary[e],ary[d]
等同于作业ary[d] = ary[e]; ary[e] = ary[e]
,因为RHS上的ary[d]
只是指向d
的{{1}}元素的指针(而不是像素值的副本。)
要解决此问题,您可以使用高级索引:
ary