多维数组
- 数组的形状(Shape):用一个元组来表示,它描述了数组的维度和长度(n0,n1,…,ni,…nm)
- 长度(Length):某个维度的元素个数
创建numpy数组
numpy:
- 提供了多维数组、矩阵的常用操作和一些高效的科学计算函数
- 底层运算通过C语言实现,处理速度快、效率高,适用于大规模多维数组
- 可以直接完成数组和矩阵运算,无需循环
创建数组:
array([列表]/(元组))
>>>import numpy as np
# 创建数组
>>>a=np.array([0,1,2,3])
# 直接输出可以看到数组的定义
>>>a
# array([0,1,2,3])
# 使用print函数可以看到数组中的元素
>>>print(a)
# [1,2,3,4]
# 使用type函数可以得到a的类型
>>>type(a)
# <class 'numpy.ndarray'>
# 可以使用索引访问numpy数组中的元素
>>>a[0]
#0
# 可以使用print输出指定元素
>>>print(a[1],a[2])
# 1 2
# 和列表类似也可以使用切片访问数组中的一部分
>>>a[0:3]
# array([0,1,2])
>>>a[:3]
# array([0,1,2])
>>>a[0:]
# array([0,1,2,3])
数组的性质:
属性 | 描述 |
---|---|
ndim |
数组的维数 |
shape |
数组的形状 |
size |
数组元素的总个数 |
dtype |
数组中元素的数据类型 |
itemsize |
数组中每个元素的字节数 |
>>>a=np.array([0,1,2,3])
>>>a.ndim
1
>>>a.shape
(4,)
>>>a.size
4
Numpy要求数组中所有元素的数据类型必须是一致的
数组元素的数据类型:array([列表]/(元组), dtype=数据类型)
在使用Python列表或元组、创建Numpy数组时,所创建的数组类型,由原来的元素类型推导而来
创建特殊的数组:
函数 | 功能描述 | |
---|---|---|
np.arange(起始数字, 结束数字, 步长, dtype=数据类型) |
前闭后开:数字序列不包括结束数字;起始数字省略时,默认从0开始;步长省略时,默认为1 | 创建数字序列数组 |
np.ones(shape, dtype=数据类型) |
创建全1数组 | |
np.zeros(shape, dtype=数据类型) |
创建全0数组 | |
np.eye(shape) |
创建单位矩阵 | |
np.linspace(start, stop, num=元素个数) |
非前闭后开,包括终止数字 | 创建等差数列 |
np.logspace(start, stop, num=元素个数, base=基数) |
创建等比数列 |
asarray()
函数:将列表或元组转化为数组对象
当数据源本身已经是一个数组对象时,array会复制出一个副本占用新的内存
import numpy as np
list1=[[1,1,1],[1,1,1],[1,1,1]]
arr1=np.array(list1)
arr2=np.asarray(list1)
list1[0][0]=3
print(list1)
# [[3, 1, 1], [1, 1, 1], [1, 1, 1]]
print(arr1)
"""
[[1 1 1]
[1 1 1]
[1 1 1]]
"""
print(arr2)
"""
[[1 1 1]
[1 1 1]
[1 1 1]]
"""
当数据源本身已经是一个ndarray对象时,array仍然会复制出一个副本占用新的内存,而asarray则直接引用了原来的数组;
数组运算
二维数组元素的切片:
import numpy as np
b = np.array([[0,1,2,3],[4,5,6,7],[8,9,10,11]])
"""
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
"""
# 取某一行
b[1] # array([4, 5, 6, 7])
# 取某一列
b[:,2] # array([ 2, 6, 10])
##### 取列注意:虽然操作是二维的,但是操作的结果是一维的
# 取某一个元素
b[1,2] # 6
# 取二维数组中的另一部分数组
b[:2,:2] #等同于b[0:2,0:2]
"""
array([[0, 1],
[4, 5]])
"""
三维数组切片
数组相加:
- 相加数组的形状和长度应该一致
- 一维数组可以和多维数组相加,相加时会将一维数组扩展至多维数组
- 数组间的减法、乘法、除法运算,和加法运算规则相同
- 当两个数组中元素的数据类型不同时,精度低的数据类型会自动转换为精度高的数据类型,然后再进行计算
- 幂运算:对数组中每个元素求次方
矩阵运算:
- 矩阵乘法:乘法运算符——矩阵中对应的元素分别相乘;要得到矩阵乘积的结果——matmul函数或者dot函数
- 矩阵转置:
np.transpose()
- 矩阵求逆:
np.linalg.inv()
数组元素之间的运算:
常用的
函数 | 功能描述 |
---|---|
np.sum() |
计算所有元素的和 |
np.prod() |
计算所有元素的乘积 |
np.diff() |
计算数组的相邻元素之间的差 |
np.sqrt() |
计算各元素的平方根 |
np.exp() |
计算各元素的指数值 |
np.abs() |
取各元素的绝对值 |
要理解参数 轴(axis)——以三维数组为例:
t=np.arange(24).reshape(2,3,4)
# 形状是(2,3,4),轴有3个
"""
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]]])
"""
np.sum(t)
# Out[1]: 276
# 轴为0时,对第一个维度中的元素求和,第一个维度上有两个元素,都是二维数组,因此,就是将这两个二维数组上的元素对应相加,得到一个新的二维数组
np.sum(t,axis=0)
"""
array([[12, 14, 16, 18],
[20, 22, 24, 26],
[28, 30, 32, 34]])
"""
# 轴为1时,是将这个轴上的三个分量相加,结果中消除了这个分量,得到2*4的数组
np.sum(t,axis=1)
"""
array([[12, 15, 18, 21],
[48, 51, 54, 57]])
"""
np.sum(t,axis=2)
"""
array([[ 6, 22, 38],
[54, 70, 86]])
"""
数组的堆叠:np.stack()
np.stack((数组1, 数组2, ...), axis)
分析与验证:尝试分析数组m,n分别按照axis=0,1,2堆叠后的结果数组。
矩阵和随机数
矩阵——numpy.matrix
matrix(字符串/列表/元组/数组)
mat(字符串/列表/元组/数组)
矩阵运算——矩阵相乘
- * 符号
矩阵运算——转置、求逆
- 转置:
.T
- 求逆:
.I
矩阵 | 数组 |
---|---|
符号运算简单 | 能够表示高维数组 |
A*B | 数组更加灵活,速度更快 |
随机数模块——numpy.random
函数 | 功能描述 | 返回值 |
---|---|---|
np.random.rand(d0,d1,...dn) |
元素在[0, 1)区间均匀分布的数组 | 浮点数 |
np.random.uniform(low,high,size) |
元素在[low, high)区间均匀分布的数组 | 浮点数 |
np.random.randint |
元素在[low, high)区间均匀分布的数组 | 整数 |
np.random.randn |
产生标准正太分布的数组 | 浮点数 |
np.random.normal(loc, scale, size) |
产生正态分布的数组 | 浮点数 |
伪随机数:由随机种子,根据一定的算法生成的。
随机种子:指定随机数生成时所用算法开始的整数值。
- 如果使用相同的seed()值,则每次生成的随机数都相同。
- 如果不设置这个值,则系统根据实际来自己选择这个值,此时每次生成的随机数因时间差异而不同
- 采用
seed()
函数设置随机种子,仅一次有效 - 随机数产生的算法,和系统有关
打乱顺序函数:np.randomo.shuffle(序列)