我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

在平时的python代码学习中,.reshape()方法经常跟在.arange()后面,但是它并不是一维等差数列的专属方法,而是所有的ndarray变量都可以使用的。这就是本文要重点澄清的事情之一。

苏南大叔:如何利用reshape方法,重排ndarray的shape形状及维度? - ndarray-reshape
如何利用reshape方法,重排ndarray的shape形状及维度?(图3-1)

大家好,这里是苏南大叔的“程序如此灵动”博客,本文描述dataframe类型变量,如何重新改变其形状。测试环境:win10python@3.11.0numpy@1.24.2。任何维度的ndarray都可以被.reshape()

准备一个数据

老生常谈,为了文章内容的正常展开,这里需要一个龙套角色,用于引出其.reshape()方法。参考文章:

被重塑形状的ndarray变量可以是任意形状任意维度的,都是可以被重塑的。理解上可以理解为先拆散重排为一维数组,然后再按照新的尺寸要求进行填充。

import numpy as np
sn = np.array([["苏", "南", "大", "叔", "博", "客"], ["su", "nan", "da", "shu", "bo", "ke"]])
print(sn)
print(sn.size, sn.ndim, sn.shape)

输出:

[['苏' '南' '大' '叔' '博' '客']
 ['su' 'nan' 'da' 'shu' 'bo' 'ke']]
12 2 (2, 6)

重塑为目标形状的基本原则

其实,这里隐藏了一个条件,就是新的维度信息的参数,相乘得到的乘积是原来的数组成员数量总和。可以打印一下ndarray的相关信息来印证自己的猜想。

苏南大叔:如何利用reshape方法,重排ndarray的shape形状及维度? - ndarray-reshape-code
如何利用reshape方法,重排ndarray的shape形状及维度?(图3-2)

如果某个轴向上面的数量不一定,那么有个隐藏的参数-1,设置为-1就不那么为难了。

苏南大叔:如何利用reshape方法,重排ndarray的shape形状及维度? - ndarray-reshape-code2
如何利用reshape方法,重排ndarray的shape形状及维度?(图3-3)

【重要的原则】是:重塑为几个维度,就填几个参数!!新多出的参数,就是新添加的概念!一维变二维增加的是行的概念,二维变三维增加的是通道(层)的概念!

重塑为一维数组

ndarray.reshape(数)
sn1 = sn.reshape(12)  # 重塑为一维数组
print(sn1)
print(sn1.size, sn1.ndim, sn1.shape)

输出:

['苏' '南' '大' '叔' '博' '客' 'su' 'nan' 'da' 'shu' 'bo' 'ke']
12 1 (12,)

不定数量时:

sn1 = sn.reshape(-1)  # 重塑为一维数组
print(sn1)
print(sn1.size, sn1.ndim, sn1.shape)

重塑为二维数组

ndarray.reshape(行数,列数)
sn2 = sn.reshape(1, 12)  # 重塑为二维数组
print(sn2)
print(sn2.size, sn2.ndim, sn2.shape)
[['苏' '南' '大' '叔' '博' '客' 'su' 'nan' 'da' 'shu' 'bo' 'ke']]
12 2 (1, 12)
sn2 = sn.reshape(3, 4)  # 重塑为二维数组
print(sn2)
print(sn2.size, sn2.ndim, sn2.shape)
[['苏' '南' '大' '叔']
 ['博' '客' 'su' 'nan']
 ['da' 'shu' 'bo' 'ke']]
12 2 (3, 4)

不定数量时:

sn2 = sn.reshape(1, -1)  # 重塑为二维数组
print(sn2)
print(sn2.size, sn2.ndim, sn2.shape)

sn2 = sn.reshape(2, -1)  # 重塑为二维数组
print(sn2)
print(sn2.size, sn2.ndim, sn2.shape)

sn2 = sn.reshape(3, -1)  # 重塑为二维数组
print(sn2)
print(sn2.size, sn2.ndim, sn2.shape)

重塑为三维数组

ndarray.reshape(通道数,行数,列数)
sn3 = sn.reshape(2, 2, 3)  # 重塑为三维数组
print(sn3)
print(sn3.size, sn3.ndim, sn3.shape)
[[['苏' '南' '大']
  ['叔' '博' '客']]

 [['su' 'nan' 'da']
  ['shu' 'bo' 'ke']]]
12 3 (2, 2, 3)
sn3 = sn.reshape(3, 2, 2)  # 重塑为三维数组
print(sn3)
print(sn3.size, sn3.ndim, sn3.shape)
[[['苏' '南']
  ['大' '叔']]

 [['博' '客']
  ['su' 'nan']]

 [['da' 'shu']
  ['bo' 'ke']]]
12 3 (3, 2, 2)

不定数量时:

sn3 = sn.reshape(-1, 3, 4)  # 重塑为三维数组
print(sn3)
print(sn3.size, sn3.ndim, sn3.shape)

sn3 = sn.reshape(-1, 2, 2)  # 重塑为三维数组
print(sn3)
print(sn3.size, sn3.ndim, sn3.shape)

结束语

更高维度的话,也支持,就是比较难理解了。所以,这里就不做描述了。放个文章链接,如果读者有需要,可以点击:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   python