Python之数据分析(Numpy的数组切片、数组变维、组合与拆分)

2023-05-16

文章目录

      • 一、Numpy的切片
      • 二、数组变维
      • 三、组合与拆分

一、Numpy的切片

1、格式
数组[起始:终止:步长]

2、缺省值
缺省起始:步长为正,首;步长为负,尾
缺省终止:步长为正,尾后;步长为负,首前
缺省步长:1

3、端部切片
靠近端部的一个或几个连续的维度使用缺省切片,可以用“…”表示

  • print(a[3:6]): 起始包括终止不包括:有指定起始值,则不包括起始值,即4到6包括6
  • print(a[-4:-7:-1]) :步长为-1,起始是倒数第3个即7(不包括),终止是倒数第6个即4(包括)

4、练习代码

import numpy as np

# 一维数组的切片取值
# a = np.arange(1,10)  # 表示1,2,3,4,5,6,7,8,9
# print(a[:3])  # 与索引不同,缺省起始为首(第一个),即1;这里表示1到3包括3,步长为1
# print(a[3:6])  # 起始包括终止不包括:有指定起始值,则不包括起始值,即4到6包括6
# print(a[6:])  # 缺省终止为尾后(最后一个),即9,这里表示从7到9
# print(a[::-1])  # 缺省起始为首9,缺省终止为尾后1,即所有的数都包括在内,步长为负,所以是逆序
# print(a[:-4:-1])  # 步长为-1,缺省起始是尾,即9;-4是倒数第3个,到7
# print(a[-4:-7:-1])  # 步长为-1,起始是倒数第3个即7(不包括),终止是倒数第6个即4(包括)
# print(a[-7::-1])  # 步长为-1,起始是倒数第6个即4(不包括),终止是缺省终止1(倒序最后一个)
# print(a[...])  # 端部切片,全部取
# print(a[::3])  # 全取,步长3
# print(a[1::3])  # 从1开始取到结束,步长3
# print(a[:9:3])  # 从首取到9(包括),步长3

# 二维数组的切片取值
b = np.arange(1, 25).reshape(2, 3, 4)  # 将一维的数组变为2*3*4的三维数组
# print(b)
'''
[[[ 1  2  3  4]
  [ 5  6  7  8]
  [ 9 10 11 12]]

 [[13 14 15 16]
  [17 18 19 20]
  [21 22 23 24]]]
'''
print(b[:, 0, 0])  # ":"在页位上,表示每一页;后面的0表示第0行第0列
print(b[0, :, :])  # 第0页上是所有行所有列,即整个第0页
print(b[0, 1, ::2])  # 第0页的第1行,用步长为2从整行取
print(b[:, :, 1])  # 每一页的每一行的第一列,也可表示为print(b[..., 1])
print(b[:, 1])  # 每一页的第一行,没有表示列的
print(b[-1, 1:, 2:])  # 最后一页,第1行(起始不包括)到最后一行,第2列(起始不包括)到最后一列

二、数组变维

1、视图变维: 针对一个数组对象获取其不同维度的视图数组
reshape(新维度)——>数组的新维度视图
ravel()——>数组的一维视图

2、复制变维: 针对一个数组对象获取其不同维度的副本
flatten()——>数组的一维副本
实际上在内部,改变维度其实是重新创建了一个对象,指向原来那个对象包含数据的内存地址

3、就地变维: 直接改变某个数组本身的维度
数组.shape = 新维度
数组.resize(新维度)

4、视图转置: 行列互换,行数变成列数,列数变成行数
数组.transpose()——>数组的转置视图
数组.T:转置视图属性来转置

5、练习代码

import numpy as np

a = np.arange(1, 9)
b = a.reshape(2, 4)  # 创建了一个a数组的视图b
# print(b)
c = b.reshape(2, 2, 2)  # 3页3行3列
# print(c)
d = c.ravel()  # 回到原来的数组,一维数组

# flatten创建副本,副本与原来的数组是独立的
e = b.flatten()
# print(d)
# print(e)

a += 10  # 将a中的元素都+10,则每个reshape来的数组都会变化,而flatten得到的副本不会变
# print(a, b, c, d,sep='\n')
# print(e)

# reshape()也可以创建副本,需要用copy()
f = b.reshape(2, 2, 2).copy()
b += 10
# print(b)
# print(f)

# 就地变维:直接改变某个数组本身的维度
a.shape = (2, 2, 2)
# print(a)
a.resize(2, 4)
# print(a)

# 视图转置
g = a.T  # 原本是2*4,现在是4*2
# 或者使用g = a.transpose()
print(g)

三、组合与拆分

1、vstack与vsplit
stack就是栈(堆叠)的意思,split就是分割的意思。
1)垂直组合:numpy.vstack((上,下))

2)垂直拆分:numpy.vsplit(数组,份数)——>子数组集合

3)水平组合:numpy.hstack((左,右))

4)水平拆分:numpy.hsplit(数组,份数)——>子数组集合

5)深度组合:numpy.dstack((前,后))

6)深度拆分:numpy.dsplit(数组,份数)——>子数组集合

7)行组合:numpy.row_stack((上,下))

8)列组合:numpy.column_stack((左,右))

2、练习代码

import numpy as np

# 垂直组合vstack
a = np.arange(11, 20).reshape(3, 3)
b = np.arange(21, 30).reshape(3, 3)
# 将a与b组成一个栈,a在上,b在下
c = np.vstack((a, b))
# print(c)

# 垂直拆分vsplit
a, b = np.vsplit(c, 2)  # 将c拆成2份,结果放在a,b中
# print(a)
# print(b)

# 水平组合,水平拆分
c = np.hstack((a, b))
# print(c)
a, b = np.hsplit(c, 2)  # 在水平方向将c拆成2份
# print(a, b, sep='\n')

# 深度组合,深度拆分
c = np.dstack((a, b))
# print(c)
'''深度组合的结果
[[[11 21]
  [12 22]
  [13 23]]

 [[14 24]
  [15 25]
  [16 26]]

 [[17 27]
  [18 28]
  [19 29]]]
'''
a, b = np.dsplit(c, 2)
# 依然是三维数组,不会回到原来的a,b
# print(a, b, sep='\n')
# 转置两次才可以回到原来的a,b
# print(a.T[0].T, b.T[0].T, sep='\n')


# 行列组合
a = a.ravel()  # 回到原来的一维数组
b = b.ravel()
c = np.row_stack((a, b))  # 拼接成两个一维数组,呈2行
# print(c)
c = np.column_stack((a, b))  # 呈2列
print(c)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python之数据分析(Numpy的数组切片、数组变维、组合与拆分) 的相关文章

随机推荐