1.概念
1.矢量:矢量是指一堆数形成的集合。多维数组也叫做矢量化计算。 单独一个数叫做量标。
2.多维数组:Numpy对多维数组的定义:用numpy.ndarray类(ndarray中,n代表n个数,d代表dimision维度)
ndarray本身是一个类,有这个类实例化出来的对象,就是多维数组。
多维数组也是一个对象。
3.关于维度的属性
shape属性
shape属性的值是一个元祖类型,一个元祖内包含多个元素。分别是从高到低来表示它的每一个维度的数。即高维度到低维度。
2.Numpy的内置类型和自定义类型
2.1.内置类型
优点:可指定数据类型所占内存是多少、可灵活变化。
缺点:因为具有灵活可变性,会牺牲一部分性能。(因需要留出足够多空间) 无法使用固定内存地址的计算方法,只能用动态来完成,有关地址运算就要占用运行时间。
注意:在Numpy中为每一种类型都提供了固定的大小,所以有关地址运算完全可以通过类型来确定。Numpy定义了一套自己的独立的数据类型体系。它的数据类型有固定长度。字节数都是固定的。
eg:NUmpy.bool 一个布尔占一个字节。
有符号版本:
- int8 1字节有符号类型
- int16 2字节有符号类型
- int32 4字节有符号类型
无符号版本(只有正数,没有负数:
- uint8 1字节无符号类型
- uint16 2字节无符号类型
- uint32 4字节无符号类型。
浮点类型:
- float16 2字节浮点型
- float32 4字节浮点型
- float64 8字节浮点型
- 注:浮点型字节数越大精度越高,浮点型都是有符号的。
复数类型(实部和虚部个用一个4字节浮点型表示):
- complex64 8字节复数型
- complex128 16字节复数型
- 注:一个复数等于两个浮点型。
字符串类型(str_):字符串类型没有规定多少字节,因为字符串类型取决于字符串Unicode有多长;字符串类型的长度根据字符窜所包含的字符来决定,有多少个字节,就有多少个字节。
2.2.自定义类型
1.直接使用内置类型的原始名
2.使用紧凑类型格式(类型编码字符串)
简化操作:可以用更少的字符串来表示
全称 | 简化格式 |
Numpy.int8 | i1 |
int16 | i2 |
Uint32 | U4 |
Float16 | f8 |
complex128 | c16 |
3.多字节的整数存在大小端序
对于多字节整数可以加上字节序前缀。
前缀类型:
‘’<‘’ ,小端字节序,低数位低地址
"=" ,系统默认,不能人为指定,由系统决定
">",大端字节序,低数位高地址
备注:关于字节序:不需要添加字节序的有单字节整数、布尔值、复数类型、浮点型。
Numpy.str =>U+字符数
Unicode 本身就是多字节整数
一个Unicode可以看作一个uint32.它也存在大小端字节序
Numpy.bool => b
注:Numpy提供的是Python的封装,用自定义类型方法可以完成一个元素不同类型的访问;或把一个元素用不同类型来组合,弥补了Numpy数组元素同质情况。
3.Numpy切片
Numpy与Python切片相似
数组[起始:终止:步长] 可以针对多维数组进行切片。
可以针对多维来切片
a =np.arange(1,10)
print(a)
print(a[:3])
print(a[3:6])
print(a[6:])
print(a[::-1])
print(a[:-4:-1])
print(a[-4:-7:-1])
b = np.arange(1,25).reshape(2,3,4)
print(b)
print(b[:,:,0])
print(b[0,:,:])
print(b[0,1,::2])
print(b[-1,1:,2:])
4.改变维度
分为四种方式:
视图变维:针对一个数组对象获取不同维度的视图
方法:数组.reshape(新维度)-->数组新维度视图
数组。ravel()-->数组的一维视图
复制变维(不同维度的拷贝):
针对一个数组对象获取其不同维度的副本
方法:flatten()-->数组的一位副本
功能:在获得原数据实例的同时获得了拷贝,也就是副本
就地变维
数组.shape=(新维度)
等价于
数组.resize(新维度)
视图转置
可以理解为行列互换
数组.transpose()-->数组的转置视图
等价于
数组.T --->转置视图属性
5.组合和拆分
垂直组合
numpy.vstack((上,下))
垂直拆分
numpy.vsplit(数组,份数)
例如:a,b =np.vsplit(c,2)
水平组合
numpy.hstack((上,下))
水平拆分
numpy.hsplit(数组,份数)
例如:a,b =np.hsplit(c,2)
深度组合和深度拆分
c=np.dstack((前,后))
a,b=np.dsplit((数组,份数))
备注:前后布局,用第三个垂直于平面来截线,截到这部分以数组形式组合起来,构成一个三维数组。
这三个截面就是三个页面,每个页面上都有一个二维数组来自于所对应的行,同时还做了转置,截到的行转成列。
深度拆分:
a,b = np.dsplit(c,2)
print(a.T[0].T,b.T[0].T,sep='\n')
T[0].T的意思是转置取0
行列组合
特点:只能组合,不能拆分
numpy.row_stack((上,下))
numpy.column_stack((左,右))