科学计算库 Numpy
一、Numpy基本操作
数组特性
array.shape # 查看数组的shape属性
type(array) # 打印当前数据格式
array.dtype # 打印当前数据类型
array.size # 打印当前数组中元素个数
array.ndim # 打印当前数据维度
二、数据类型与数值计算
# 各个元素累乘
tang_array.prod()
tang_array.prod(axis=0)
tang_array.prod(axis=1)
# 求各元素中的最小值
tang_array.min()
tang_array.min(axis=0)
tang_array.min(axis=1)
# 求均值
tang_array.mean()
tang_array.mean(axis=0)
# 求标准差
tang_array.std()
tang_array.std(axis=1)
# 求方差
tang_array.var()
# 比2小的全部为2,比4大的全部为4
tang_array.clip(2,4)
# 四舍五入
tang_array = np.array([1.2, 3.56, 6.41])
tang_array.round()
# 还有指定一个精度
tang_array.round(decimals=1)
# 得到的是索引位置
tang_array.argmin()
# 也可以按照指定的维度来确定最小值的位置
tang_array.argmin(axis=0)
tang_array.argmin(axis=1)
在学习过程中一定要养成勤查文档的习惯,其中最权威、最有学习价值的就是工具包官方文档。但是,面对这么多函数和参数,想要将其全部背下来是不可能的,因此,反复查阅的过程也是学习进步的过程。
help(想要查询的API文档)
三、常用功能模块
tang_array = np.array([[1.5, 1.3, 7.5], [5.6, 7.8, 1.2]])
# 排序
np.sort(tang_array)
# 排序也可以指定维度
np.sort(tang_array, axis=0)
# 排序后,用元素的索引位置代替排序后的实际结果
np.argsort(tang_array)
再创建一个数组,如果此时又新增一组数据,想要按照大小顺序把他们插入刚创建的数组中。
tang_array = np.linspace(0, 10, 10) # 在0~10之间生成等间隔的10个数
values = np.array([2.5, 6.5, 9.5])
# 算好合适的位置
np.searchsorted(tang_array, values)
将数据按照第一列的升序或者降序对整体数据进行排序:
tang_array = np.array([[1, 0, 6], [1, 7, 0], [2, 3, 1], [2, 4, 0]])
# 降序
index = np.lexsort([-1*tang_array[:, 0]])
# 升序
index = np.lexsort([tang_array[:, 0]])
数组形状操作
# 创建一个数组,默认从0开始,arange()函数的结果经常可以作为索引。
tang_array = np.arange(10)
# 增加维度
tang_array = tang_array[np.newaxis,:]
# 对数组进行压缩,把多余的维度去掉
tang_array = tang_array.squeeze()
# 对数组进行转置
tang_array.transpose()
tang_array.T
数组的拼接
a = np.array([[1, 2, 3], [4, 5, 6]])
b = np.array([[7, 8, 9], [10, 11, 12]])
np.concatenate((a, b))
np.concatenate((a, b), axis=1)
# 另外一种拼接方法
d = np.array([1, 2, 3])
e = np.array([2, 3, 4])
np.stack((d, e))
类似的还有hstack和vstack操作,分别表示水平和竖直的拼接方式。
对于多维数组,还可以用array.flatten()将数组拉直。
创建数组函数
# 表示创建零矩阵,里面包含3个元素
np.zeros(3)
# 注意下面有两个括号的,传入的参数是(3,3),表示创建3X3的零矩阵
np.zeros((3, 3))
# 表示创建单位矩阵,用法和zeros是一样的
np.ones((3, 3))
# 根据我们的需求来进行组合变换即可
np.ones((3,3)) * 8
# 也可以先创建一个空的, 指定好其大小, 然后往里面填充值
a = np.empty(6)
# 用数值 1 来进行填充
a.fill(1)
# 先创建好一个数组
tang_array = np.array([1,2,3,4])
# 初始化一个零矩阵, 让它和某个数组的维度一致
np.zeros_like(tang_array)
# 只有对角线有数值, 并且为 1
np.identity(5)
随机模块
初始化参数、切分数据集、随机采样等操作都会用到随机模块:
# 其中 (3,2) 表示构建矩阵的大小
np.random.rand(3,2)
# 返回区间 [0,10) 的随机的整数
np.random.randint(10,size = (5,4))
# 如果只想返回一个随机值
np.random.rand()
# 也可以自己指定区间并选择随机的个数
np.random.randint(0,10,3)
# 符合均值为 0, 标准差为 0.1 的高斯分布的随机数
np.random.normal(mu,sigma,10)
# 可以进行全局的设置, 来控制结果的输出
np.set_printoptions(precision = 2)
np.random.normal(mu,sigma,10)
tang_array = np.arange(10)
# 每次执行的结果都是不一样的
np.random.shuffle(tang_array)
随机种子可以实现进行随机操作,但每次的随机结果都相同。这里每次都把种子设置成100,说明随机策略相同,无论执行多少次随机操作,其结果都是相同的。不同的种子,结果是完全不同的。
在对数据进行预处理时,经常加入新的操作或改变处理策略,此时如果伴随着随机操作,最好还是指定唯一的随机种子,避免由于随机的差异对结果产生影响。
np.random.seed(100)
np.random.normal(mu,sigma,10)
文件读写
# Notebook的魔法指令,相当于写了一个文件
%%writefile tang.txt
1 2 3 4 5 6
2 3 5 8 7 9
如果用Python来读取数据:
data = []
with open('tang.txt') as f:
for line in f.readlines():
fileds = line.split()
cur_data = [float(x) for x in fileds]
data.append(cur_data)
data = np.array(data)
Numpy只需要一行就完成上述操作:
data = np.loadtxt('tang.txt')
如果数据中带有分隔符:
%%writefile tang2.txt
1,2,3,4,5,6
2,3,5,8,7,9
data = np.loadtxt('tang2.txt', delimiter=',')
加入无关项:
%%writefile tang2.txt
x,y,z,w,a,b
1,2,3,4,5,6
2,3,5,8,7,9
# 可以指定去掉前几行
data = np.loadtxt('tang2.txt', delimiter = ',', skiprows = 1)
还可以将数据写入文件中:
np.savetxt('tang4.txt',tang_array,fmt='%d',delimiter = ',')
在numpy中还有一种“.npy”格式,也就是把数据保存成ndarray的格式,这种方法非常实用,可以把程序运行结果保存下来,再次使用的时候直接加载就好,非常便捷。
tang_array = np.array([[1,2,3],[4,5,6]])
# 把结果保存成 npy 格式
np.save('tang_array.npy',tang_array)
# 读取之前保存的结果, 依旧是 Numpy 的数组格式。
np.load('tang_array.npy')
要想查看保存的文件放在哪,可以在notebook中输入下列代码:
import os
os.path.abspath('.')

260





