文章目录
- Python机器学习库(numpy库)
- 1. 数据的维度
- 2. numpy基础知识
- 2.1 numpy概述
- 2.1 numpy概述
- 2.1 numpy概述
- 2.2 numpy库的引用
- 3. ndarray数组的创建
- 3.1 N维数组对象ndarray
- 3.2 创建ndarray数组
- 3.2.1 使用Python列表、元组创建ndarray数组
- 3.2.2 使用numpy函数创建ndarray数组
- 3.3 ndarray数组的属性
- 3.4 ndarray数组的元素类型
- 3.5 ndarray数组的变换
Python机器学习库(numpy库)
1. 数据的维度
一个数据表达一个含义,而一组数据表达一个或多个含义。
维度:是一组数据的组织形式
一维数据:由对等关系的有序或无序数据构成,采用线性方式组织,对应列表、数组和集合等概念。
列表:数据类型可以不同
数组:数据类型相同
二维数据:由多个一维数据构成,是一维数据的组合形式。
表格是典型的二维数据,其中,表头是二维数据的一部分
多维数据:由一维或二维数据在新维度上扩展形成。
数据维度的Python表示:
- 一维数据:列表和集合类型
- 二维数据:列表类型
- 多维数据:列表类型
- 高维数据:字典类型或其它如JSON、XML和YAML格式
2. numpy基础知识
2.1 numpy概述
numpy是开源的Python科学计算基础库,包含:
- 强大的N维数组对象ndarray(Array; Matrix)
- 成熟的(广播)函数库
- 整合了C/C++/Fortran代码的工具
- 实用的线性代数、傅里叶变换和随机数生成函数
- 与稀疏矩阵运算包scipy配合使用更加方便
2.1 numpy概述
numpy是开源的Python科学计算基础库,包含:
- 强大的N维数组对象ndarray(Array; Matrix)
- 成熟的(广播)函数库
- 整合了C/C++/Fortran代码的工具
- 实用的线性代数、傅里叶变换和随机数生成函数
- 与稀疏矩阵运算包scipy配合使用更加方便
2.1 numpy概述
numpy是开源的Python科学计算基础库,包含:
- 强大的N维数组对象ndarray(Array; Matrix)
- 成熟的(广播)函数库
- 整合了C/C++/Fortran代码的工具
- 实用的线性代数、傅里叶变换和随机数生成函数
- 与稀疏矩阵运算包scipy配合使用更加方便
numpy是SciPy、Pandas等数据处理或科学计算库的基础。它提供了许多高级的数值编程工具,如:矩阵数据类型、矢量处理,以及精密的运算库,为进行严格的数字处理而产生。很多大型金融公司,以及核心的科学计算组织如:Lawrence Livermore,NASA都在用其处理一些本来使用C++,Fortran或Matlab等所做的任务。
2.2 numpy库的引用
Anaconda里面已经安装过numpy。
原生Python安装:
在控制台中输入:
pip install numpy
安装之后可以导入
import numpy as np
#尽管别名可以省略或更改,但建议使用以上约定俗成的别名“np“
3. ndarray数组的创建
3.1 N维数组对象ndarray
Python已有列表类型,为什么需要一个数组对象(类型)?
标准Python中用list(列表)保存值,可以当做数组使用,但因为列表中的元素可以是任何对象,所以浪费了CPU运算时间和内存。
numpy诞生为了弥补这些缺陷。它提供了两种基本的对象:
- ndarray:全称(n-dimensional array object)是储存单一数据类型的多维数组。
- ufunc:全称(universal function object)它是一种能够对数组进行处理的函数。
numpy中文官网
A和B是一维数组,计算A2+B3,示例如下:
# python基础语法方式
def pySum():
a=[0,1,2,3,4]
b=[5,6,7,8,9]
c=[]
for i in range(len(a)):
c.append(a[i]+b[i])
return c
print(pySum())
[5, 7, 9, 11, 13]
# numpy库方式
def npSum():
a=np.array([0,1,2,3,4])
b=np.array([5,6,7,8,9])
return a+b
print(npSum())
[ 5 7 9 11 13]
N维数组对象:ndarray
ndarray是一个多维数组对象,由两部分构成:
- 实际的数据
- 描述这些数据的元数据(数据维度、数据类型等)
numpy 最重要的一个特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引。
ndarray 对象是用于存放同类型(同质)元素的多维数组。
ndarray对维数没有限制。
小括号从左到右分别为第0轴,第1轴,第2轴,第3轴。
3.2 创建ndarray数组
ndarray数组的创建方法:
x = np.array(list/tuple)
x = np.array(list/tuple, dtype=np.float32)
当np.array()不指定dtype时,numpy将根据数据情况关联一个dtype类型
一维ndarray
import numpy as np
# 一维array
a = np.array([2,23,4], dtype=np.int32) # np.int默认为int32
print(a)
print(a.dtype)
[ 2 23 4]
int32
多维ndarray
# 多维array
a = np.array([[2,3,4],
[3,4,5]])
print(a) # 生成2行3列的矩阵
[[2 3 4]
[3 4 5]]
c = np.array([(1,2,3),
[4,5,6],
(7,8,9)],dtype=np.float32)
c,c.dtype
(array([[1., 2., 3.],
[4., 5., 6.],
[7., 8., 9.]], dtype=float32),
dtype(‘float32’))
3.2.2 使用numpy函数创建ndarray数组
函数 | 说明 |
---|---|
np.arange(n) | 类似range()函数,返回ndarray类型,元素从0到n‐1 |
np.ones(shape) | 根据shape生成一个全1数组,shape是元组类型 |
np.zeros(shape) | 根据shape生成一个全0数组,shape是元组类型 |
np.full(shape,val) | 根据shape生成一个数组,每个元素值都是val |
np.linspace() | 根据起止数据等间距地填充数据,形成数组 |
np.empty(shape)) | 创建全空数组每个值都是接近于零的数 |
np.eye(n) | 创建一个正方的n*n单位矩阵,对角线为1,其余为0 |
np.ones_like(a) | 根据数组a的形状生成一个全1数组 |
np.zeros_like(a) | 根据数组a的形状生成一个全0数组 |
np.full_like(a,val) | 根据数组a的形状生成一个数组,每个元素值都是val |
np.concatenate() | 将两个或多个数组合并成一个新的数组 |
创建连续数组
# 创建连续数组
a = np.arange(10,41,2) # 10-20的数据,步长为2
print(a)
[10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40]
创建全1数据
# 创建全一数据,同时指定数据类型
a = np.ones((3,4),dtype=np.int32)
print(a)
[[1 1 1 1]
[1 1 1 1]
[1 1 1 1]]
创建全零数组
a = np.zeros((3,4))
print(a) # 生成3行4列的全零矩阵
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
创建全特定数值ndarray数组
a=np.full((3,4,5),10)
a.shape,a
((3, 4, 5),
array([[[10, 10, 10, 10, 10],
[10, 10, 10, 10, 10],
[10, 10, 10, 10, 10],
[10, 10, 10, 10, 10]],
[[10, 10, 10, 10, 10],
[10, 10, 10, 10, 10],
[10, 10, 10, 10, 10],
[10, 10, 10, 10, 10]],
[[10, 10, 10, 10, 10],
[10, 10, 10, 10, 10],
[10, 10, 10, 10, 10],
[10, 10, 10, 10, 10]]]))
根据起止数据创建等间距序列数据
# 创建线段型数据
a = np.linspace(1,10,20) # 开始端1,结束端10,且分割成20个数据,生成线段
print(a)
[ 1. 1.47368421 1.94736842 2.42105263 2.89473684 3.36842105
3.84210526 4.31578947 4.78947368 5.26315789 5.73684211 6.21052632
6.68421053 7.15789474 7.63157895 8.10526316 8.57894737 9.05263158
9.52631579 10. ]
创建全空数组
# 创建全空数组,其实每个值都是接近于零的数
a = np.empty((3,4))
print(a)
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
#将列表转换为矩阵
a=np.eye(5)
print(a)
[[1. 0. 0. 0. 0.]
[0. 1. 0. 0. 0.]
[0. 0. 1. 0. 0.]
[0. 0. 0. 1. 0.]
[0. 0. 0. 0. 1.]]
3.3 ndarray数组的属性
属性 | 说明 |
---|---|
.ndim | 秩,即轴的数量或维度的数量 |
.shape | ndarray数组的尺度,对于矩阵,n行m列 |
.size | ndarray数组元素的个数,相当于.shape中n*m的值 |
.dtype | ndarray数组的元素类型 |
.itemsize | ndarray数组中每个元素的大小,以字节为单位 |
秩、维度、轴的数量
a=np.full((3,4,5),1.,dtype=np.float32)
print(a)
print('number of dim:', a.ndim)
[[[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]]
[[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]]
[[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]]]
number of dim: 3
数组的尺度、行数、列数…
print('shape:',a.shape)
shape: (3, 4, 5)
元素个数
print('size:',a.size)
size: 60
元素类型
print('type:',a.dtype)
type: float32
查看每个元素所占空间的大小,以字节为单位
print('size:',a.itemsize)
size: 4
3.4 ndarray数组的元素类型
数据类型 | 说明 |
---|---|
bool | 布尔类型,True或False |
intc | 与C语言中的int类型一致,一般是int32或int64 |
intp | 用于索引的整数,与C语言中size_t一致,int32或int64 |
int8 | 字节长度的整数,取值:[‐128,127] |
int16 | 16位长度的整数,取值:[‐32768,32767] |
int32 | 32位长度的整数,取值:[‐231,231‐1] |
int64 | 64位长度的整数,取值:[‐263,263‐1] |
uint8 | 8位无符号整数,取值:[0,255] |
uint16 | 16位无符号整数,取值:[0,65535] |
uint32 | 32位无符号整数,取值:[0,232‐1] |
uint64 | 32位无符号整数,取值:[0,264‐1] |
float16 | 16位半精度浮点数:1位符号位,5位指数,10位尾数 |
float32 | 32位半精度浮点数:1位符号位,8位指数,23位尾数 |
float64 | 64位半精度浮点数:1位符号位,11位指数,52位尾数 |
complex64 | 复数类型,实部和虚部都是32位浮点数 |
complex128 | 复数类型,实部和虚部都是64位浮点数 |
Python语法仅支持整数、浮点数和复数3种类型,而ndarray为什么要支持这么多种元素类型?
- 科学计算涉及数据较多,对存储和性能都有较高要求
- 对元素类型精细定义,有助于numpy合理使用存储空间并优化性能
- 对元素类型精细定义,有助于程序员对程序规模有合理评估
ndarray数组可以由非同质对象构成,非同质ndarray元素为对象类型,非同质ndarray数组无法有效发挥numpy优势,尽量避免使用。
x=np.array([[0,1,2,3,4],
[5,6,7,8]],dtype=object)
x.dtype
dtype(‘O’)
dtype(‘O’)显示ndarray数组x中的每个元素是非同质对象类型。
x=np.array([[0,1,2,3,4],
[5,6,7,8,9]],dtype=object)
x.dtype
dtype(‘O’)
3.5 ndarray数组的变换
对于创建后的ndarray数组,可以对其进行维度变换和元素类型变换。
方法 | 说明 |
---|---|
.reshape(shape) | 不改变数组元素,返回一个shape形状的数组,原数组不变 |
.resize(shape) | 与.reshape()功能一致,但修改原数组 |
.swapaxes(ax1,ax2) | 将数组n个维度中两个维度进行调换 |
.flatten() | 对数组进行降维,返回折叠后的一维数组,原数组不变 |
.astype() | 对数组进行类型变换 |
.tolist() | 将数据类型转换为列表 |
reshape操作
a = [ i for i in range(24)]
a=np.array(a)
print(a)
# 使用reshape改变上述数据的形状
b = a.reshape((4,6))
print(b)
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
b.resize((2,3,4))
b
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
c = b.swapaxes(0,1)
print(c, c.shape)
[[[ 0 1 2 3]
[12 13 14 15]]
[[ 4 5 6 7]
[16 17 18 19]]
[[ 8 9 10 11]
[20 21 22 23]]] (3, 2, 4)
c=b.flatten()
c
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23])
ndarray数组的类型变换
new_a = a.astype(new_type)
a=np.ones((2,3,4),dtype=np.int32)
a