小有改动,主要参考:
python:shape和reshape()函数
python中reshape
在numpy中,shape和reshape()函数的功能都是对于数组的形状进行操作。shape函数可以了解数组的结构,reshape()函数可以对数组的结构进行改变。
import numpy as np
#设置一个数组
a = np.array([1,2,3,4,5,6,7,8])
print(a.shape) '''结果:(8,)'''
print(type(a.shape)) '''结果:tuple'''
print(a.shape[0]) '''结果:8'''
b = np.array([[1,2],[2,3],[3,4]])
print(b.shape) '''结果:(3, 2)'''
print(b.shape[0]) '''结果:3'''
print(b.shape[1]) '''结果:2'''
结论:我们可以通过shape函数得出数组的形状,得出的结果是一个tuple格式的数据,之后我们可以获取其中的数据。
a = np.array([1,2,3,4,5,6,7,8])
print(a.reshape(2,4))
'''结果:array([[1, 2, 3, 4],
[5, 6, 7, 8]])
'''
print(a.reshape(4,2))
'''结果:
array([[1, 2],
[3, 4],
[5, 6],
[7, 8]])
'''
结论:reshape()函数可以改变数组的形状,并且原始数据不发生变化。
但是,reshape()函数中的参数需要满足乘积等于数组中数据总数。
如:当我们将8个数使用(2,3)重新排列时,python会报错
而且,reshape()函数得出的数组与原数组使用的是同一个存储空间,改变一个,另一个也随之改变。
shape和reshape()函数都是对于数组(array)进行操作的,对于list结构是不可以的
比如
arr = [1,2,3,4,5,6,7,8,9] # 一个一维的list,长度为9
想把arr变成一个3*3的矩阵,这就可以用的reshape了,有两个方法,第一
arr.reshape(3,3)
这个很好理解,不多说,重点看第二个方法
arr.reshape(-1,3)
这样也可以把arr变成3*3的矩阵,这个-1代表的意思就是,我不知道可以分成多少行,但是我的需要是分成3列,多少行我不关心。
最后,看一个实际的例子,在这个数据集里面
from sklearn.datasets import load_digits # 一个图片的数据集
这个图像的表示方法是1797*64,表示1797张图片,每张图片用一行64个数表示,怎么把这一行的数据取出来呢?就是用的reshape这个函数
picture_data = data.reshape(-1,8,8,1)
-1表示不知道,两个8表示8行8列,1表示一维空间(彩色是在处理的时候是三维空间RGB),整短代码就是说,把179764这个矩阵,变换成88的不知道多少个的矩阵,这样后面就方便用CNN神经网络去处理了
在如何表示一组彩色图片的问题上,Theano和TensorFlow发生了分歧, '日’模式,也即Theano模式会把100张RGB三通道的16×32(高为16宽为32)彩色图表示为下面这种形式(100,3,16,32),Caffe采取的也是这种方式。第0个维度是样本维,代表样本的数目,第1个维度是通道维,代表颜色通道数。后面两个就是高和宽了。这种theano风格的数据组织方法,称为“channels_first”,即通道维靠前。
而TensorFlow,的表达形式是(100,16,32,3),即把通道维放在了最后,这种数据组织方式称为“channels_last”。
keras中添加卷积层时,可以指定deat_format格式:
model.add(Convolution2D(
batch_input_shape=(None, 1, 28, 28), #多少数据 通道数 宽 高
filters=32, #滤波器数量
kernel_size=5, #滤波器大小5x5
strides=1, #步长1
padding='same', # Padding method
data_format='channels_first',
))