reshape()用法 【reshape(-1)、reshape(-1,1)、reshape(1,-1)、reshape(m,-1)、reshape(-1,m)、reshape(-1,m,n)】

numpy.arange(n).reshape(a, b) 依次生成n个自然数,并且以a行b列的数组形式显示

np.arange(16).reshape(2,8) #生成16个自然数,以28列的形式显示
# 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必须是整数,不然报错)

1 reshape(m, -1)即行数固定,列数需要计算

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)
'''

2 reshape(-1, m) 即列数固定,行数需要计算

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) #二维,121print(a1)
'''
[[ 0]
 [ 1]
 [ 2]
 [ 3]
 [ 4]
 [ 5]
 [ 6]
 [ 7]
 [ 8]
 [ 9]
 [10]
 [11]]
 '''
 
a3 = arr.reshape(-1,6) #二维,26print(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)
'''
'''

3 一维和二维数组,reshape(-1),reshape(-1,1),reshape(1,-1)对比

二维数组
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) #二维,121print(a1)
'''
[[ 0]
 [ 1]
 [ 2]
 [ 3]
 [ 4]
 [ 5]
 [ 6]
 [ 7]
 [ 8]
 [ 9]
 [10]
 [11]]
 '''

a2 = arr.reshape(1,-1) #二维,112print(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]]
'''

4 转换为3维、4维矩阵

定义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函数的三种常见相关用法

5 python数组和矩阵用法

矩阵是一种二维数据结构,和二维数组相似,但二者又有很大差别。很多时候我们都直接将二维数组当作矩阵运算

其实就是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数组和矩阵用法

  • 5
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

R-G-B

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值