一. 学会使用 ndarray
1.1 什么是 ndarray?
ndarray 是 NumPy 中的一种多维数组对象, 他可以是一维的, 二维的, 甚至更多维次. 当然创建更多维次的数组并不是他的优点所在, 他的优点在于它有丰富的运算方法, 同时他也是另一个高级 Python 库 pandas 的基础库, 但是他只能存放同种类型的元素.
1. 2 创建一个 ndarray
第一种创建方式有: 直接使用列表创建 ndarray, 如下:
- # 第一种直接通过列表创建
- a_list=[0,1,2,3,4]
- a_ndarray=np.array(a_list)# 创建了一个一维的数组
- print(type(a_ndarray))
上面创建了一个一维的数组, 那么我们也可以创建一个二维, 三位的数组
来看下面的代码:
- c_list=[[0,0],[1,1,1],[2,2]]# 这是一个不规则的二维列表
- c_ndarray=np.array(c_list)
- print(c_ndarray)# 输出数组
输出为:[list([0, 0]) list([1, 1, 1]) list([2, 2])]
第二种创建方式: 创建指定形状指定初始值的数组
当我们制定的初始值为 0 或者 1 时, 我们可以使用函数 zeros 或者 ones 这两个函数接受一个元组来表示这个数组的形状.
代码如下:
- # 创建指定形状和初始值的 ndarray
- d_ndarray=np.zeros(3)# 指定初始值为 0, 初始形状为一维长度为 3
- print(d_ndarray)
输出的结果为:[0. 0. 0.]在这里我们的元素类型为 float
- e_ndarray=np.ones((3,2))# 创建一个数组 3 行 2 列
- print(e_ndarray)
使用 eye 函数创建一个 N*N 的单位矩阵(对角线为 1, 其余的为 0)
- f_ndarray=np.eye(3,3)# 创建 3*3 的单位矩阵
- print(f_ndarray)
1.3 判断 ndarray 的形状和元素类型
判断一个 ndarray 的形状使用 ndarray 的 shape 属性
- e_ndarray=np.ones((3,2))
- print(e_ndarray)
- print(e_ndarray.shape)# 输出形状
输出为:(3, 2)
判断一个 ndarray 的元素类型
- e_ndarray=np.ones((3,2))
- print(e_ndarray)
- print(e_ndarray.dtype)# 输出元素的类型
输出为: float64
1.4ndarray 的运算
相乘:
- a_ndarray=np.array([[1,2,3],[4,5,6]])
- b_ndarray=np.array([[7,8,9],[10,11,12]])
- c_ndarray=a_ndarray*b_ndarray# 相乘
- print(c_ndarray)
输出:[[ 7 16 27]
[40 55 72]]
可以发现数组相乘是遍历数组的每一个元素进行相乘.
相减:
- a_ndarray=np.array([[1,2,3],[4,5,6]])
- b_ndarray=np.array([[7,8,9],[10,11,12]])
- c_ndarray=a_ndarray-b_ndarray# 相减
- print(c_ndarray)
输出:[[-6 -6 -6]
[-6 -6 -6]]
对应的元素相减
取倒数:
- d_ndarray=1/a_ndarray #取倒数
- print(d_ndarray)
输出:[[1. 0.5 0.33333333]
[0.25 0.2 0.16666667]]
乘方:.
- e_ndarray=a_ndarray**2# 乘方
- print(e_ndarray)
输出: [[ 1 4 9]
[16 25 36]]
1.5ndarray 的切片和拷贝
ndarray 的切片和 list 的切片区别:
针对 list:
- a_list=[1,2,3,4,5]
- print(a_list) #第一次输出
- b_list=a_list # 直接赋值
- b_list[0]=0
- print(a_list) #第二次输出
输出:[1, 2, 3, 4, 5]
[0, 2, 3, 4, 5]
发现通过直接赋值 list, 改变其中一个另一个也会改变.
- a_list=[1,2,3,4,5]
- print(a_list)# 第一次输出
- c_list=a_list[0:len(a_list)] # 使用切片
- c_list[0]=0
- print(a_list)# 第二次输出
输出:[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
我们发现 list 切片是不会改变原来的元素的, 就是完成了一次拷贝将拷贝的 list 传给了新的 list
针对 ndarray 的切片:
- a_list=[1,2,3,4,5]
- a_ndarray=np.array(a_list)
- b_ndarray=a_ndarray[0:len(a_list)]
- print(a_ndarray)# 第一次输出
- b_ndarray[0]=9
- print(a_ndarray)# 第二次输出
输出:[1 2 3 4 5]
[9 2 3 4 5]
我们发现 ndarray 中的切片赋值也是只是创建了一个新的引用指向原来的对象.
那么在 ndarray 中想要拷贝就需要用到 copy 函数, 如下:
- a_list=[1,2,3,4,5]
- a_ndarray=np.array(a_list)
- b_ndarray=a_ndarray.copy()
- print(a_ndarray)# 第一次输出
- b_ndarray[:]=9
- print(a_ndarray)# 第二次输出
输出:[1 2 3 4 5]
[1 2 3 4 5]
1.6 数组的转置:
- # 数组的转置
- import numpy as np
- a_ndarray=np.array([[0,0,0],[1,1,1],[2,2,2]])
- print(a_ndarray)
- b_ndarray=a_ndarray.T# 转置
- print(b_ndarray)
输出:[[0 0 0]
- [1 1 1]
- [2 2 2]]
- [[0 1 2]
- [0 1 2]
- [0 1 2]]
1.7 精确到元素级别的运算函数
常见一元函数 (接受一个数组的函数) 有:
abs 取绝对值
sqrt 开方
square 平方
exp 计算各个元素的指数
log log10 log2 去对数底数分别为 e,10,2
ceil 返回大于等于 x 的最小值
floor 返回小于等于 x 的最大值
rint 将各个元素进行四舍五入得到最接近的整数
isnan 返回一个 bool 型数组表示那些是数组
sum 求和
mean 算术平均数
std var 标准差 方差
min max 最值
sort 排序
常见的二元的函数 (接受两个数组的函数) 有:
add 两个数组对应元素相加
subtract 第一个数组减去第二个数组
multiply 数组元素相乘
1.8 直接将 txt 文件中的内容转入到 ndarray 数组中
使用函数 loadtxt 可以将文件中的数据导入 ndarray 中:
- import numpy as np
- a_ndaarray=np.loadtxt(r"E:\PythonWork\py 学习 \ test",delimiter=',',encoding='GBK')
- print(a_ndaarray)
输出为:
同理 savetxt 函数是将数组存储到 txt 文件中
1.9 线性代数中的数组 (矩阵) 运算
diag 返回一个一维数组表示一个矩阵的对角线
T 矩阵转置
dot 矩阵乘法
trace 计算对角线元素的和
det 计算矩阵的行列式
eig 计算矩阵的特征向量
来源: https://www.cnblogs.com/SAM-CJM/p/10152932.html