numpy是一个第三方库,支持大量高纬度数组与矩阵运算。此外,它也针对数组运算提供大量的数字函数。机器学习涉及到大量对数组的变化和运算,numpy就成为必不可少的工具之一。
使用numpy,可以做以下操作:
1. 数组的算数和逻辑运算
2. 傅立叶变换和用于图形操作的例程【所谓例程,就是某个系统对外提供的功能接口或服务的集合】
3. 与线性代数有关的操作,numpy用于线性代数和随机数生成的内置函数
numpy的主要对象是多维数组 Ndarray,在numpy中维度Dimensions叫做轴Axes,轴的个数叫做秩Rank
需要注意的是:numpy.array和Python标准库中array.array并不相同,前者更为强大
主要的操作有:
一、数组创建
1.查看numpy的版本
import numpy as np
version = np.__version__
print(version)
运行结果为:
2.通过列表创建一维数组
import numpy as np
list_ = [1, 2, 3, 4, 5]
arr = np.array(list_)
print(arr)
运行结果为:
3.通过列表创建二维数组
import numpy as np
tuple1 = (1, 2, 3)
tuple2 = (4, 5, 6)
# 无论是使用列表还是元组,都能进行创建
list_ = (tuple1, tuple2)
arr = np.array(list_)
print(arr)
list_ = [list(tuple1), list(tuple2)]
arr = np.array(list_)
print(arr)
运行结果为:
4.创建全为 0 的二维数组
import numpy as np
# 这里传入的参数,元组和列表都可
arr = np.zeros((3, 4))
print(arr)
arr = np.zeros([3, 4])
print(arr)
运行结果为:
5.创建全为 1 的三维数组
import numpy as np
# 这里传入的参数,也是元组和列表都可
arr = np.ones((3, 4))
arr = np.ones([3, 4])
print(arr)
运行结果为:
6.使用full函数,创建任意大小的数组并填充任意数字
import numpy as np
# 这里传入的参数,也是元组和列表都可
arr = np.full((3, 4), 5)
arr = np.full([3, 4], 5)
print(arr)
运行结果为:
7.创建一维等差数组
import numpy as np
'''
第一个参数:开始位置【包括】
第二个参数:结束位置【不包括】
第三个参数:步长
'''
arr = np.arange(0, 5, 2)
print(arr)
运行结果为:
8.创建二维等差数组
import numpy as np
# 创建了一维等差数组后,再使用reshape函数,将其变为二维等差数组
arr = np.arange(1, 7, 1).reshape(2, 3)
print(arr)
运行结果为:
注意:如果在reshape函数中传入的参数不能将一维等差数组平均分配,就会报错
import numpy as np
arr = np.arange(1, 7, 1).reshape(4, 2)
print(arr)
运行结果为:
9.创建单位矩阵(二维数组)
import numpy as np
arr = np.eye(3)
print(arr)
运行结果为:
10.创建二维随机数组
import numpy as np
arr = np.random.rand(2, 3)
print(arr)
运行结果为:
11.创建二维随机整数数组
import numpy as np
"""
前两个参数,用来指定范围,包括第一个参数,不包括第二个,因为如果想要创建一维数组的话,还可以这样写:
np.random.randint(1, 2, size=(2, 3))
size参数,主要是用来指定数组大小,这里传入的参数,也是元组和列表都可
"""
arr = np.random.randint(1, 5, size=(2, 3))
arr = np.random.randint(1, 5, size=[2, 3])
print(arr)
运行结果为:
二、数组运算
1.sum
import numpy as np
a = np.array([[1, 2], [3, 4]])
arr = np.sum(a)
print(arr)
# axis=0 表示对每一列求和
arr = np.sum(a, axis=0)
print(arr)
# axis=1 表示对每一行求和
arr = np.sum(a, axis=1)
print(arr)
运行结果为:
2.mean 【求平均值】
import numpy as np
a = np.array([[1, 2], [3, 4]])
arr = np.mean(a)
print(arr)
运行结果为:
3.tile
import numpy as np
a = np.array([[1, 2], [3, 4]])
# 对数组a进行改变,行数不变,列数乘以2倍
arr = np.tile(a, (1, 2))
print(arr)
# 对数组a进行改变,列数不变,行数乘以2倍
arr = np.tile(a, (2, 1))
print(arr)
运行结果为:
4.argsort
import numpy as np
a = np.array([[3, 6, 4, 11],
[5, 10, 1, 3]])
# 将元素安装行从小到大进行排序,返回对应位置的元素的下标
res = a.argsort()
print(a)
print(res)
# 按照列排序
res = a.argsort(axis=0)
print(a)
print(res)
运行结果为:
5.一维数组加法运算
import numpy as np
a = np.array([10, 20, 30, 40, 50])
b = np.arange(1, 6)
print(a)
print(b)
arr = a + b
print(arr)
运行结果为:
6.一维数组减法运算
import numpy as np
a = np.array([10, 20, 30, 40, 50])
b = np.arange(1, 6)
print(a)
print(b)
arr = a - b
print(arr)
运行结果为:
7.一维数组乘法运算
import numpy as np
a = np.array([10, 20, 30, 40, 50])
b = np.arange(1, 6)
print(a)
print(b)
arr = a * b
print(arr)
运行结果为:
8.一维数组除法运算
import numpy as np
a = np.array([10, 20, 30, 40, 50])
b = np.arange(1, 6)
print(a)
print(b)
arr = a / b
print(arr)
运行结果为:
9.二维数组的运算
import numpy as np
# 在相应的位置上进行加减乘除
# 加法
a = np.array([[1, 2],
[3, 4]])
b = np.array([[5, 6],
[7, 8]])
print(a)
print(b)
arr = a + b
print(arr)
# 减法
print(a)
print(b)
arr = a - b
print(arr)
# 乘法
print(a)
print(b)
arr = a * b
print(arr)
# 除法
print(a)
print(b)
arr = a / b
print(arr)
运行结果为:
C:\Users\EDY\AppData\Local\Programs\Python\Python39\python.exe D:\Practice\numpy\练习.py
[[1 2]
[3 4]]
[[5 6]
[7 8]]
[[ 6 8]
[10 12]]
[[1 2]
[3 4]]
[[5 6]
[7 8]]
[[-4 -4]
[-4 -4]]
[[1 2]
[3 4]]
[[5 6]
[7 8]]
[[ 5 12]
[21 32]]
[[1 2]
[3 4]]
[[5 6]
[7 8]]
[[0.2 0.33333333]
[0.42857143 0.5 ]]
Process finished with exit code 0
10.矩阵乘法运算【注意与9的区别】
import numpy as np
# 这里的乘法,使用的是线性代数中矩阵的乘法,而不是上面在对应的位置进行相乘
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
arr = np.dot(a, b)
print(arr)
运行结果为:
11.如果使用 np.mat 将二维数组准确定义为矩阵,就可以直接使用 * 完成矩阵乘法计算
import numpy as np
# 简单说就是实现矩阵相乘的另一种写法
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
arr = np.mat(a) * np.mat(b)
print(arr)
运行结果为:
12.转置矩阵
import numpy as np
a = np.array([[1, 2], [3, 4]])
print(a)
arr = a.T
print(arr)
运行结果为:
13.矩阵求逆
import numpy as np
a = np.array([[1, 2], [3, 4]])
print(a)
arr = np.linalg.inv(a)
print(arr)
运行结果为:
14.广播
import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
b = np.array([1, 2, 3])
# 要想实现在a的每一行上加上b,可以这么写
arr = a + np.tile(b, (3, 1))
print(arr)
# 但是在numpy中,能够自动实现广播功能,即当参与运算的操作数的维度不一样时,会自动将其转换成相同的维度,并进行运算
arr = a + b
print(arr)
运行结果为:
三、索引
1.取出某个确定的值
import numpy as np
a = np.array([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]])
# 第一个参数代表一维,第二个参数代表二维,以此类推
print(a[1, 2])
运行结果为:
2.取出某个范围的值
import numpy as np
a = np.array([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]])
# 用冒号来区分每个维度,和切片一样
# 代表着指定的范围为:从第二行开始,到最后,每一行中取最后一个元素
print(a[1:, -1:])
运行结果为:
3.给某个范围的数进行运算
import numpy as np
a = np.array([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]])
# 将数组a中的第二列上的每个数加上10
a[np.arange(3), 1] += 10
print(a)
# 还可以这样写,相当于一行对应一个列
a[[0, 1, 2], [1, 1, 2]] += 10
print(a)
运行结果为:
4.获取数组中大于或小于某个确定值的数值
import numpy as np
a = np.array([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]])
result_index = a > 10
print(result_index)
print(a[result_index])
# 简化后
print(a[a > 10])
运行结果为:
四、判断元素数据类型并进行转换
1.使用dtype函数查看数组的数据类型,并且在创建数组时,可以使用dtype参数进行数据类型转换
import numpy as np
a = np.array([1, 2, 3])
print(a.dtype)
a = np.array([1.1, 2.2])
print(a.dtype)
a = np.array([1, 1.2])
print(a.dtype)
# 将数据类型转换为整数,直接去掉小数部分,并不会四舍五入
a = np.array([1.1, 2.6], dtype=np.int64)
print(a)
print(a.dtype)
运行结果为:
2.使用astype转换数据类型
import numpy as np
a = np.array(['1.2', '1.3', '1.4'], dtype=np.string_)
print(a)
print(a.dtype)
a = np.array(['1.2', '1.3', '1.4']).astype(np.float_)
print(a)
运行结果为:
注意:在使用astype函数进行传参时,不能写 np.float,否则会报错
import numpy as np
a = np.array(['1.2', '1.3', '1.4'], dtype=np.string_)
print(a)
print(a.dtype)
a = a.astype(np.float)
print(a)
运行结果为: