numpy.arange(n).reshape(a, b) 依次生成n个自然数,并且以a行b列的数组形式显示
np.arange(16).reshape(2,8) #生成16个自然数,以2行8列的形式显示
# Out:
# array([[ 0, 1, 2, 3, 4, 5, 6, 7],
# [ 8, 9, 10, 11, 12, 13, 14, 15]])
mat (or array).reshape(c, -1) 必须是矩阵格式或者数组格式,才能使用 .reshape(c, -1) 函数, 表示将此矩阵或者数组重组,以 c行d列的形式表示
reshape(m,-1) #改成m行,列数需要计算
reshape(-1,m) #改成m列,行数需要计算
reshape(-1)#改成一行一维,同reshape([-1])
reshape(-1,m,n)#改成三维矩阵,不知道几个小矩阵,改成m*n的小矩阵
reshape(-1,2,2,3)#改成四维矩阵,不知道几个小矩阵,改成2个,2*3的小矩阵
-1的作用就在此: 自动计算d:d=数组或者矩阵里面所有的元素个数/c, d必须是整数,不然报错)
arr=np.arange(16).reshape(2,8)
arr
'''
out:
array([[ 0, 1, 2, 3, 4, 5, 6, 7],
[ 8, 9, 10, 11, 12, 13, 14, 15]])
'''
arr.reshape(4,-1) #将arr变成4行的格式,列数自动计算的(c=4, d=16/4=4)
'''
out:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
'''
arr.reshape(8,-1) #将arr变成8行的格式,列数自动计算的(c=8, d=16/8=2)
'''
out:
array([[ 0, 1],
[ 2, 3],
[ 4, 5],
[ 6, 7],
[ 8, 9],
[10, 11],
[12, 13],
[14, 15]])
'''
arr.reshape(10,-1) #将arr变成10行的格式,列数自动计算的(c=10, d=16/10=1.6 != Int)
'''
out:
ValueError: cannot reshape array of size 16 into shape (10,newaxis)
'''
arr=np.arange(12).reshape(3,4)
print(arr)
'''
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
'''
a1 = arr.reshape(-1,1) #二维,12行1列
print(a1)
'''
[[ 0]
[ 1]
[ 2]
[ 3]
[ 4]
[ 5]
[ 6]
[ 7]
[ 8]
[ 9]
[10]
[11]]
'''
a3 = arr.reshape(-1,6) #二维,2行6列
print(a3)
'''
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]]
'''
# a4 = arr.reshape(-1,5) #12/5不能整除报错
#print(a4)
'''
ValueError: cannot reshape array of size 12 into shape (5)
'''
'''
二维数组
arr=np.arange(12).reshape(3,4)
arr=np.arange(12).reshape(3,4)
a = arr.reshape(-1)
print(a)
'''
[ 0 1 2 3 4 5 6 7 8 9 10 11]
'''
a1 = arr.reshape(-1,1) #二维,12行1列
print(a1)
'''
[[ 0]
[ 1]
[ 2]
[ 3]
[ 4]
[ 5]
[ 6]
[ 7]
[ 8]
[ 9]
[10]
[11]]
'''
a2 = arr.reshape(1,-1) #二维,1行12列
print(a2)
'''
[[ 0 1 2 3 4 5 6 7 8 9 10 11]]
'''
一维数组
arr2 = np.array([0,1,2,3,4,5,6,7,8,9,10,11])
arr2 = np.array([0,1,2,3,4,5,6,7,8,9,10,11])
print(arr2)
'''
[ 0 1 2 3 4 5 6 7 8 9 10 11]
'''
b1 = arr2.reshape(-1)
print(b1)
'''
[ 0 1 2 3 4 5 6 7 8 9 10 11]
'''
b2 = arr2.reshape(-1,1)
print(b2)
'''
[[ 0]
[ 1]
[ 2]
[ 3]
[ 4]
[ 5]
[ 6]
[ 7]
[ 8]
[ 9]
[10]
[11]]
'''
b3 = arr2.reshape(1,-1)
print(b3)
'''
[[ 0 1 2 3 4 5 6 7 8 9 10 11]]
'''
定义z是一个3行4列的矩阵
z = np.array([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]])
z.reshape(-1,2,3)
z_4=z.reshape(-1,2,3)#不知道有几个小矩阵,改成二乘三的小矩阵,这里意思是最后一维度是3(最内部的[]包含3个元素),倒数第二个维度是2
print("z.reshape(-1,2,3)的结果:")
print(z_4)
print("结果大小:",z_4.shape)
如果需要构造2乘3小矩阵的三维新矩阵(只知道新矩阵的小矩阵的行列信息),newshape=2乘3,也即是z.shape(-1,2,3),那么-1的用处就是根据这个2乘3小矩阵这个信息,计算得出新的三维矩阵需要多少个2乘3的小矩阵,12除以(2乘3)=2,那么新的三维矩阵就是一个2乘2乘3的三维矩阵。(这里三维矩阵的说法有问题,希望理解就OK)
输出
z.reshape(-1,2,3)的结果:
[[[ 1 2 3]
[ 4 5 6]]
[[ 7 8 9]
[10 11 12]]]
结果大小: (2, 2, 3)
z.reshape(-1,3,4)
z_5=z.reshape(-1,3,4)#不知道几个小矩阵,改成三乘四的小矩阵
print("z.reshape(-1,3,4)的结果:")
print(z_5)
print("结果大小:",z_5.shape)
输出
.reshape(-1,3,4)的结果:
[[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]]
结果大小: (1, 3, 4)
z.reshape(-1,2,2,3)
z_6=z.reshape(-1,2,2,3)
print("z.shape(-1,2,2,3)的结果:")
print(z_6)
print("结果大小:",z_6.shape)
输出
z.reshape(-1,2,2,3)的结果:
[[[[ 1 2 3]
[ 4 5 6]]
[[ 7 8 9]
[10 11 12]]]]
结果大小: (1, 2, 2, 3)
小贴士
[[[[ 1 2 3]
[ 4 5 6]]
[[ 7 8 9]
[10 11 12]]]]
结果大小: (1, 2, 2, 3)
对于四维数据的理解,1表示最外部的[]包含1个低一级的[],第一个2表示低一级的[]包含2个更低一级的[],
第二个2表示更低一级的[]包含2个最低级的[],3表示最低级的[]包含3个元素;
这里的1表示的是第一个维度,第一个2表示的是第二个维度,第二个2表示的是第三个维度,3表示的是第4个维度
z1=tf.reshape(z,[-1,1])跟z2=z.reshape(-1,1)作用是一样
但是print(z2)可以打印出结果,print(z1)没有结果
因为tensorflow操作是需要session才能运行的,前期只是搭建框架,设置变量结构
这里的1是指最低级的[]包含1个元素,也就是最后的一个维度的值是1
参考
reshape(-1)函数的理解(代码讲解)
NUMPY中RESHAPE函数的三种常见相关用法
矩阵是一种二维数据结构,和二维数组相似,但二者又有很大差别。很多时候我们都直接将二维数组当作矩阵运算
其实就是numpy中mat()函数和array()函数的区别:
import numpy as np
a1 = np.array([[1,2,3], [4,5,6]])
b1 = np.mat([[1,2,3], [4,5,6]])
二者区别,参考:python数组和矩阵用法