- 什么是numpy
NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
NumPy 是一个运行速度非常快的数学库,主要用于数组计算,包含:
- 一个强大的N维数组对象 ndarray
- 广播功能函数
- 整合 C/C++/Fortran 代码的工具
- 线性代数、傅里叶变换、随机数生成等功能
NumPy 通常与 SciPy(Scientific Python)和 Matplotlib(绘图库)一起使用, 这种组合广泛用于替代 MatLab,是一个强大的科学计算环境,有助于我们通过 Python 学习数据科学或者机器学习。
二. Numpy的使用
-
用Numpy创建数组
import numpy as np # 1). 创建数组: a, b, c创建的数组相同, 任选一种; a = np.array([1, 2, 3, 4, 5]) b = np.array(range(1, 6)) c = np.arange(1, 6) print(a, b, c) # # # 2). 查看numpy创建的数组类型 print(type(a)) print(type(b)) print(type(c)) # # 3). 查看数组存储的数据类型, 常见的数据类型还有哪些? print(a.dtype) # 为什么是int64? 因为硬件架构是64位; # 4). 制定创建的数组的数据类型 d = np.array([1.9, 0, 1.3, 0], dtype=float) print(d, d.dtype) # # 5). 修改数组的数据类型 e = d.astype('int64') # 里面可以是数据类型, 也可以是数据代码;int64---i1 print(e, e.dtype) # 6). 修改浮点数的小数点位数 # 随机创建一个三行四列的数组; f = np.random.random((3, 4)) print(f) # 修改浮点书的小数位数为3位 g = np.round(f, 3) print(g)
运行结果为:
-
矩阵的转置
import numpy as np data = np.random.random((3, 4)) # 转换数据结构 # 2,6 data = data.reshape((2, 6)) print(data) print("转置: ", data.T) print("转置: ", data.transpose()) print("转置: ", data.swapaxes(1, 0))
运行结果为:
-
Numpy的切片和索引
import numpy as np a = np.arange(12).reshape((3, 4)) print(a) # *****************取单行或者单列********************* # 取第2行; print(a[1]) # 取第3列; print(a[:, 2]) # 获取第2行3列的数据 print(a[1, 2]) # *****************取连续行或者列********************* # 取第2行和第3行; print(a[1:3]) # 取第3列和第4列 print(a[:, 2:4]) # 行: 1和2 列: 2 print(a[0:2, 1:2]) # *****************取不连续的行或者列********************* # 行: 1和3 列: all 获取第一行和第三行的所有元素 print(a[[0, 2], :]) # 行: all 列: 1, 4 print(a[:, [0, 3]]) # 行: 1 , 3 列: 1 4 获取第一行第一列的元素, 和第三行第4列的元素 print("*"*10) print(a[[0, 2], [0, 3]])
-
Numpy中数值的修改
import numpy as np # 执行行和指定列的修改 t = np.arange(24).reshape((4, 6)) print(t) #行: all, 列: 3,4 t[:, 2:4] = 0 print(t) # 布尔索引 print(t < 10) # t[t < 10] = 100 print(t) t[t > 20] = 200 print(t) # numpy的三元运算符 t<100?0:10 t1 = np.where(t < 100, 0, 10) print(t) print(t1)
运行结果为:
-
获取矩阵的四角元素
import numpy as np def get_edge(data): row ,column = data.shape rows = np.array([[0,0],[row-1,row-1]]) cols = np.array([[0,column-1] , [0,column-1]]) return data[rows,cols] if __name__ == '__main__': x= np.arange(30).reshape((5,6)) print("data" , x) print("result:" , get_edge(x))
运行结果为:
-
花式索引
""" 花式索引 花式索引指的是利用整数数组进行索引。 花式索引根据索引数组的值作为目标数组的某个轴的下标来取值。对于使用一维整型数组作为索引,如果目标是一维数组,那么索引的结果就是对应位置的元素; 如果目标是二维数组,那么就是对应下标的行。 花式索引跟切片不一样,它总是将数据复制到新数组中。 """ import numpy as np # 传入顺序索引数组 x = np.arange(32).reshape((8, 4)) print(x) print(x[[4, 2, 1, 7]]) # 传入倒序索引数组 x=np.arange(32).reshape((8,4)) print (x[[-4,-2,-1,-7]]) # 传入多个索引数组(要使用np.ix_) """ 原理:np.ix_函数就是输入两个数组,产生笛卡尔积的映射关系 将数组[1,5,7,2]和数组[0,3,1,2]产生笛卡尔积,就是得到 (1,0),(1,3),(1,1),(1,2);(5,0),(5,3),(5,1),(5,2);(7,0),(7,3),(7,1),(7,2);(2,0),(2,3),(2,1),(2,2); """ x=np.arange(32).reshape((8,4)) print(x) print (x[np.ix_([1,5,7,2],[0,3,1,2])])
运行结果为:
7. 数组形状改变
"""
reshape 不改变数据的条件下修改形状
numpy.reshape(arr, newshape, order='C')
order:'C' -- 按行,'F' -- 按列,'A' -- 原顺序,'k' -- 元素在内存中的出现顺序。
flat 数组元素迭代器
flatten 返回一份数组拷贝,对拷贝所做的修改不会影响原始数组
ravel 返回展开数组
"""
import numpy as np
print("****************************************flat********************************")
a = np.arange(9).reshape(3, 3)
print('原始数组:')
for row in a:
print(row)
# 对数组中每个元素都进行处理,可以使用flat属性,该属性是一个数组元素迭代器:
print('迭代后的数组:')
for element in a.flat:
print(element)
#
print("*********************************flatten**************************************")
a = np.arange(8).reshape(2, 4)
print('原数组:')
print(a)
print('\n')
# 默认按行
print('展开的数组:')
print(a.flatten())
print('\n')
print('以 F 风格顺序展开的数组:')
print(a.flatten(order='F'))
print("*********************************ravel*************************************")
a = np.arange(8).reshape(2, 4)
print('原数组:')
print(a)
print('\n')
print('调用 ravel 函数之后:')
print(a.ravel())
print('\n')
print('以 F 风格顺序调用 ravel 函数之后:')
print(a.ravel(order='F'))
运行结果为:
-
数组的拼接
import numpy as np print("concatenste") a = np.array([[1, 2], [3, 4]]) print("第一个数组:") print(a) print('\n') b = np.array([[5, 6], [7, 8]]) print("第二个数组:") print(b) print('\n') print("沿0轴连接两个数组") print(np.concatenate((a, b))) print('\n') print("沿1轴连接两个数组") print(np.concatenate((a, b), axis=1)) print("stack") a = np.array([[1, 2], [3, 4]]) print("第一个数组") print(a) print('\n') b = np.array([[5, 6], [7, 8]]) print("第二个数组") print(b) print('\n') print("沿0堆叠两个数组") print(np.stack((a, b), axis=0)) print('\n') print("沿1轴堆叠两个数组") print(np.stack((a, b), axis=1)) print("hstack") a = np.array([[1, 2], [3, 4]]) print("第一个数组") print(a) print('\n') b = np.array([[5, 6], [7, 8]]) print("第二个数组") print(b) print('\n') print("水平堆积") c = np.hstack((a, b)) print(c) print('\n') print("竖直堆积") d = np.stack((a, b)) print(d) print('\n')
运行结果为:
-
数组元素的添加与删除
import numpy as np print("append") a = np.array([[1,2,3] ,[4,5,6]]) print("第一个数组") print(a) print('\n') print("向数组中添加元素") print(np.append(a,[7,8,9])) print('\n') print("沿0 轴添加元素") print(np.append(a,[[7,8,9]] ,axis=0)) print('\n') print("沿1轴添加元素") print(np.append(a,[[5,5,5],[7,8,9]] ,axis=1)) print("insert") a = np.array([[1,2],[3,4],[5,6]]) print("第一个数组") print(a) print('\n') print("未传递AXIS 参数,在插入之前数组会被展开") print(np.insert(a ,3,[11,12])) print('\n') print("传递了axis 参数,会传播值数组来配入数组") print("沿0轴传播") print(np.insert(a,1,[11],axis=0)) print("沿1轴传播") print(np.insert(a,1,11,axis = 1)) print("delete") a = np.arange(12).reshape(3,4) print("第一个数组") print(a) print('\n') print("未传递axis参数,在插入之前输出的数组会被展开")
运行结果为: