我创建了一个列表列表(每行有 784 个元素( - 这是图像数据 28x28 矩阵
train_data, train_labels = X[:60000], Y[:60000]
为了模糊图像 - 这里有两个函数可以计算每个像素的新值 - 基于 8x28 矩阵中的 28 个相邻元素的平均值(为简单起见,忽略第一/最后一行和第一/最后一列,即从 2-26 而不是 0-27 循环(
def new_func(x_train_data,train_data):
for index in range(x_train_data.shape[0]):
imgvector = x_train_data[index].reshape(28, 28)
for iblur in range(2, 27):
for jblur in range(2, 27):
imgvector[iblur][jblur] = getNewVaueofPixel(imgvector, iblur, jblur)
print "blurring complete"
x_train_data[index] = imgvector.reshape(1, 784)
print np.array_equal(x_train_data[index], train_data)
def getNewVaueofPixel(imgvector, iblur, jblur):
pixelval = 0.0
for ib in range(-1, 2):
for jb in range(-1, 2):
pixelval = pixelval + imgvector[iblur + ib][jblur + jb]
outval = round(pixelval / 8.0, 12)
return ('{:.12f}'.format(outval)).rstrip('0') or 0.
下面是函数调用:
x_train_data = train_data[:1]
x_train_labels = train_labels[0]
new_func(x_train_data,train_data[0])
函数中的下行返回 true,但是当我查看 x_train_data[index] 的值时,它与原始值不同,并且已正确更新。
print np.array_equal(x_train_data[index], train_data)
我花了超过 12 个小时来调试它,但没有取得任何进展。只是不明白为什么train_data在什么时候更新
x_train_data = train_data[:1]
应创建列表的副本,而不是对它的引用。感谢任何帮助。
使用 x_train_data = train_data[:1]
在 numpy 中创建一个视图,正如@hpaulj所说。
例如:
import numpy as np
x = np.arange(5)
y = x[:3]
print(x) # [0 1 2 3 4]
print(y) # [0 1 2]
y[0] = 14 # This changes x as well
print(x) # [14 1 2 3 4]
print(y) # [14 1 2]
此外,在普通的python中,它会创建一个浅拷贝。
x = [1, [2, 3]]
y = x[:]
print(x) # [1, [2, 3]]
print(y) # [1, [2, 3]]
y[1].append(7) # changes x as well
print(x) # [1, [2, 3, 7]]
print(y) # [1, [2, 3, 7]]