Numpy
0. NumPy介绍
NumPy是Python的一个高性能科学计算和数据分析基础库,提供了功能强大的多维数组对象ndarray。
引入numpy,并重命名为np,方便使用 import numpy as np
1. 创建数组
-
1.1使用numpy内置的
array
函数创建数组- 创建一维数组
arr1 = np.array([1,2,3]) print(type(arr1)) print(arr1)
测试结果:
<class 'numpy.ndarray'>
[1 2 3]
- 创建二维数组
arr2 = np.array([[1,2,3],[4,5,6]]) print(arr2)
测试结果:
[[1 2 3]
[4 5 6]] -
1.2使用
arange
函数创建数组- 使用arange函数创建包含0到9 十个数字的一维数组
#注意:arange函数返回的数组默认第一个元素是0,结束元素是指定的数值前一个数字9 arr_1 = np.arange(10) print(arr_1)
测试结果:
[0 1 2 3 4 5 6 7 8 9]
- 通过arange函数设置“开始、结束、步长”三个参数创建包含1到10所有奇数的一维数组
#从1开始,到10前一位结束,步长为2表示相邻两个元素的差值是2 arr_2 = np.arange(1,10,2) print(arr_2)
测试结果:
[1 3 5 7 9]
-
1.3全0、全1数组
zeros
,ones
- 使用zeros函数创建一个包含10个全0数字的一维数组
- 使用ones函数创建一个包含5个全1数字的一维数组
- 创建3行4列全1二维数组
z1 = np.zeros(10) print(z1) o1 = np.ones(5) print(o1) o2 = np.ones((3,4)) print(o2)
测试结果:
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[1. 1. 1. 1. 1.]
[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]] -
1.4通过
genfromtxt
函数从文件导入生成数组
test.txt文件
aa,bb,cc
11,22,33
- ```dtype```是数组类型,```delimiter```以什么分割
text = np.genfromtxt('text.txt',dtype=str,delimiter=',')
print(type(text))
print(text)
测试结果:
<class 'numpy.ndarray'>
[['aa' 'bb' 'cc']
['11' '22' '33']]
2. 数组的属性方法
-
2.1 查看数组维度
shape
- 查看o2各维度的大小
- 查看o2第1维的大小(行数)
- 查看o2第2维的大小(列数)
o2 = np.ones((3,4)) #运行结果是一个元组(3,4)表示第1维的大小是3(也是就是3行),第2维的大小是4(也就是4列) print(o2.shape) print(o2.shape[0]) print(o2.shape[1])
测试结果:
(3, 4)
3
4
-
2.2元素类型及转换
dtype
,astype
- 查看数组中元素类型
- 类型转换函数
print(o2.dtype) #类型转换函数astype,数组元素由float64类型转换成int32类型,并返回一个新的数组o2_1,原数组o2元素类型不变 o2_1 = o2.astype(np.int32) #o2数组类型不变 print(o2.dtype) #o2_1数组中元素类型为int32 print(o2_1.dtype)
测试结果:
float64
float64
int32
#创建字符串类型数组,dtype('<U5')表示字符串不超过5位 arr_string = np.array(["12.78","23.15","34.5"]) print(arr_string.dtype) #将字符串数组转换成浮点类型数组 arr_float = arr_string.astype(np.float64) print(arr_float.dtype) print(arr_float) #float类型数组转换成整型数组,小数部分将会被截断 arr_int = arr_float.astype(np.int32) print(arr_int.dtype) print(arr_int) #numpy自动识别元素类型 print(np.array([1, 2, 3]).dtype)
测试结果:
<U5
float64
[12.78 23.15 34.5 ]
int32
[12 23 34]
int32
3. 索引与切片
-
3.1一维数组索引与切片
#创建一维数组 arr1d = np.arange(10) print(arr1d) #数组的索引从0开始,通过索引获取第三个元素 print(arr1d[2]) #切片,左闭右开区间,从索引3开始,直到索引7结束 print(arr1d[3:8]) #数组脚标由右往左是从-1开始,每向左一位脚标数字减1,获取最后一个元素,等价arr1d[9] print(arr1d[-1]) #将标量赋值给切片,会广播到切片的整个选区 arr1d[3:5] = 10 print(arr1d)
测试结果:
[0 1 2 3 4 5 6 7 8 9]
2
[3 4 5 6 7]
9
[ 0 1 2 10 10 5 6 7 8 9]
-
3.2二维数组索引与切片
#创建二维数组 arr2d = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]]) print(arr2d) #第一维脚标(索引值)是0的元素是一个数组 print(arr2d[0]) #第一维脚标(索引值)是1,第二维脚标(索引值)是3的元素,可以理解为获取二维数组中第2行第4列的元素 print(arr2d[1, 3]) #截取到二维数组的第二个元素 print(arr2d[:2]) #只有冒号表示选取整个行轴的元素,竖轴从脚标1取到脚标3的前一位,可以理解为取所有行的第2列和第3列数据 print(arr2d[:, 1:3]) #沿着第行轴方向从脚标1开始取到最后,竖轴从脚标1开始取到3的前一位 print(arr2d[1:, 1:3])
测试结果:
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]][1 2 3 4]
8
[[1 2 3 4]
[5 6 7 8]][[ 2 3]
[ 6 7]
[10 11]][[ 6 7]
[10 11]]
4. 数组的运算
-
4.1转置(行转列,列转行)
#reshape(shape)函数改变数组形状,shape是一个元组,表示数组的形状 #创建一个包含15个元素的一维数组,通过reshape函数调整数组形状为3行5列的二维数组 arr = np.arange(15).reshape((3,5)) print(arr) #转置,数组转置可以使用transpose方法或者T属性,转置返回的是源数组的视图,不会进行任何复制操作 #将3行5列的二维数组arr转置为5行3列的二维数组 print(arr.transpose()) #使用T属性实现转置 print(arr.T) #注意:转置过后是生成新数组 print(arr)
测试结果:
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]][[ 0 5 10]
[ 1 6 11]
[ 2 7 12]
[ 3 8 13]
[ 4 9 14]][[ 0 5 10]
[ 1 6 11]
[ 2 7 12]
[ 3 8 13]
[ 4 9 14]][[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]]
-
4.2数组与标量算术运算
arr1 = np.array([[1,2,3],[4,5,6]]) #对数组中每个元素求平方 print(arr1 ** 2) #数组arr1中的每个元素加10 print(arr1 + 10)
测试结果:
[[ 1 4 9]
[16 25 36]][[11 12 13]
[14 15 16]]
-
4.3算术运算
- 注意:两个数组做算数法要求两个数组的结构要相同
#数组加法,两个数组对应位置的元素相加 arr1 = np.array([[1,2,3],[4,5,6]]) arr2 = np.ones((2,3)) print(arr1 + arr2 ) #数组减法,两个数组对应位置的元素相减 print(arr1 - arr2) #数组乘法,两个数组对应位置的元素相乘 arr3 = np.array([[2,2,2],[2,2,2]]) print(arr1 * arr3) #使用tile函数构造数组,上一个arr3构造具有相同元素的数组非常麻烦,使用tile函数非常简洁 #第1个参数表示需要复制的数组,第二个参数是对应的轴方向上复制的次数 #第2个参数(2,3)表示在第0轴(行)方向复制2次,第1轴(竖)方向复制3次,这样就构成了一个2行3列的二维数组 arr4 = np.tile([2],(2,3)) print(arr4) #数组除法,两个数组对应位置的元素相除 print(arr1 / arr4)
测试结果:
[[2. 3. 4.]
[5. 6. 7.]][[0. 1. 2.]
[3. 4. 5.]][[ 2 4 6]
[ 8 10 12]][[2 2 2]
[2 2 2]][[0.5 1. 1.5]
[2. 2.5 3. ]]
5. 常用统计方法
-
5.1使用
sum
函数对数组中全部或者某轴向的元素求和- 沿着第0轴方向求和arr1.sum(axis=0)
- 简写arr1.sum(0)
- 沿着第1轴方向求和arr1.sum(axis=1)
- 简写arr1.sum(1)
arr1 = np.array([[1,2,3],[4,5,6]]) # 2行3列二维数组 #数组中全部元素求和 print(arr1.sum()) #沿着第0轴方向求和arr1.sum(axis=0) #简写arr1.sum(0) print(arr1.sum(0)) #沿着第1轴方向求和arr1.sum(axis=1) #简写arr1.sum(1) print(arr1.sum(1))
测试结果:
21
[5 7 9]
[ 6 15]
-
5.2算术平均数
mean
函数
arr1 = np.array([[1,2,3],[4,5,6]]) # 2行3列二维数组 #求数组中全部元素的算术平均数 print(arr1.mean()) #沿第0轴方向求算术平均数 print(arr1.mean(0)) #沿第1轴方向求算术平均数 print(arr1.mean(1))
测试结果:
3.5
[2.5 3.5 4.5]
[2. 5.]
-
5.3最大最小值
mx
,min
函数
arr1 = np.array([[1,2,3],[4,5,6]]) # 2行3列二维数组 #全部元素最大值 print(arr1.max()) #全部元素最小值 print(arr1.min()) #沿第0轴方向最大值 print(arr1.max(0)) #沿第0轴方向最小值 print(arr1.min(0)) #沿第1轴方向最大值 print(arr1.max(1)) #沿第1轴方向最小值 print(arr1.min(1))
测试结果:
6
1
[4 5 6]
[1 2 3]
[3 6]
[1 4]