NumPy 快速入门:算数运算、统计计算、集合运算及文件读写方法介绍
NumPy 快速入门:算数运算、统计计算、集合运算及文件读写方法介绍
前言:
NumPy 模块作为 Python 的常用科学计算模块,其提供了大量的计算方法。本篇博客主要介绍 NumPy 的简单算数运算、统计计算、集合运算及文件读写方法。
本篇博客主要内容有:
- 简单算数运算;
- 逻辑筛选方法;
- 数组修建相关方法;
- 数组的集合运算及排序
- 文件读写方法。
简单算数运算方法:
简单算数运算常被分为两种:一元算数运算,二元算数运算。
一元算数运算:
一元算数运算指:接收运算元素为一个的算数运算,常见的有平方,平方根等。
import numpy as np
arr1 = np.arange(10)
print(arr1)
# [0 1 2 3 4 5 6 7 8 9]
"一元算数运算"
# 计算平方
arr2 = np.square(arr1)
print(arr2)
# [ 0 1 4 9 16 25 36 49 64 81]
# 计算平方根
print(np.sqrt(arr2))
# [0. 1. 2. 3. 4. 5. 6. 7. 8. 9.]
# 计算指数ex
print(np.exp(arr1))
'''
[1.00000000e+00 2.71828183e+00 7.38905610e+00 2.00855369e+01
5.45981500e+01 1.48413159e+02 4.03428793e+02 1.09663316e+03
2.98095799e+03 8.10308393e+03]
'''
NumPy 包含了很多其他的一元算数运算:
二元算数运算:
二元算数运算就是指,参与计算的元素有两个,最常见的二元算数运算就是加减乘除法了。
两个数组中取最值、加减法及阶层运算示例:
"二元算数运算"
arr3 = np.arange(0,10,3)
print(arr3)
# [0 3 6 9]
arr4 = np.arange(1,8,2)
print(arr4)
# [1 3 5 7]
# 取两个数组对应位置的元素最大值
print(np.maximum(arr3,arr4))
# [1 3 6 9]
# 取最小值
print(np.minimum(arr3,arr4))
# [0 3 5 7]
# 将两个元素相加
print(np.add(arr3,arr4))
# [ 1 6 11 16]
# 将一个元素的值减去另一个元素的值
print(np.subtract(arr3,arr4)) # arr3 减去 arr4
# [-1 0 1 2]
# 阶乘
print(np.power(arr3,arr4))
# [ 0 27 7776 4782969]
print(np.power(arr3,3))
# [ 0 27 216 729]
NumPy 中的其他二元运算:
逻辑筛选 :
NumPy 中的 where 方法:
NumPy 中有一个 whehe 方法,其实也可以理解为三元表达式:x if condition else y 。
如:有如下两个一维数组和一个布尔数组。
"逻辑筛选"
arr5 = np.array([1.1,1.2,1.3,1.4,1.5])
arr6 = np.array([2.1,2.2,2.3,2.4,2.5])
cond = np.array([True,False,True,True,False])
需要依据 cond 布尔数组的布尔值筛选 arr5 及 arr6 中的元素,实现当 cond 中对应值为 True 时,选取 arr5 的值,否则选择 arr6 中的值。
用 Python 中的方法 if else 表达式也可以实现,如:
# 用列表推导式:
r1 = [(x if c else y ) for x,y,c in zip(arr5,arr6,cond)]
print(r1) # [1.1, 2.2, 1.3, 1.4, 2.5]
但是其存在两个问题:1、对具有大量数据的数组处理时间长;2、无法适用于多维数组。
NumPy 中的 where 方法就提供了一个很好的解决方法:
部分源码:
def where(condition, x=None, y=None):
where(condition, [x, y])
Return elements chosen fromx
ory
depending oncondition
.
示例:
# 用NumPy的where
r2 = np.where(cond,arr5,arr6)
print(r2)
# [1.1 2.2 1.3 1.4 2.5]
np.where 的第二个、第三个参数不必是数组,也可以是标量值。 如:需对一个多维随机数组大于0的值设置为1 小于0的值设置为-1。
arr7 = np.random.randn(4,4)
print(arr7)
'''
[[ 0.94955312 -1.0180811 0.6152342 -0.4138152 ]
[ 0.4744925 0.24363219 -0.80140105 -0.18479731]
[-1.05698969 0.52721941 -1.14639344 -1.52027168]
[-0.36275851 1.81630375 -0.09173674 0.3563187 ]]
'''
arr8 = np.where(arr7>0,1,-1)
print(arr8)
'''
[[ 1 -1 1 -1]
[ 1 1 -1 -1]
[-1 1 -1 -1]
[-1 1 -1 1]]
'''
解析: np.where(arr7>0,1,-1) 中, arr > 7 产生了一个布尔数组,然后再按数组对应True 或 Flase 选择 1 或 -1 。
数组的修剪与压缩:
类似上面介绍的 where 方法,NumPy 还提供了 clip(数组修剪) 和 compress (数组压缩)两种方法:
数组修剪:将大于或小于设置条件的数组内元素值设置为指定值。
# 数组的修剪:
arr13 = np.arange(-5,5)
print(arr13)
# [-5 -4 -3 -2 -1 0 1 2 3 4]
# 将数组元素总小于0的元素设置为0
# 方法一:
print(np.where(arr13<0,0,arr13))
# [0 0 0 0 0 0 1 2 3 4]
# 方法二:
print(arr13.clip(0))
# [0 0 0 0 0 0 1 2 3 4]
解析:方法二更简便一点,但是没有where适用,where可适用于大部分需对数组内部进行逻辑筛选的情况。
# 将数组元素大于0的元素设置为0
print(arr13.clip(max=0))
# [-5 -4 -3 -2 -1 0 0 0 0 0]
数组压缩:将数组内不满足设定条件的元素舍弃。
# 筛选数组元素
# 选取数组内大于0的元素
print(arr13.compress(arr13>0))
# [1 2 3 4]
统计计算方法:
这里说的统计计算是特指统计学中的一些方法,如:求一组数组中的极值,全距,计算平均值,方差,标准差等。
简单统计计算:
如:有如下一个数组:
arr9 = np.array([[0,1,2],[3,4,5],[6,7,8]])
print(arr9)
'''
[[0 1 2]
[3 4 5]
[6 7 8]]
'''
求和、最大值、最小值、全距:
# 求和
print(np.sum(arr9)) # 36
# 最大值
print(np.max(arr9)) # 8
# 最小值
print(np.min(arr9)) # 0
# 全距:最大值减去最小值
print(np.ptp(arr9)) # 8
求均值、方差、标准差:
# 算数平均数
print(np.mean(arr9)) # 也可写成arr9.mean()
# 4.0
# 方差
print(np.var(arr9)) # 6.666666666666667
# 标准差
print(np.std(arr9)) # 2.581988897471611
" std(a, axis=None, dtype=None, out=None, ddof=0, keepdims=np._NoValue):"
" ddof *度形参,默认为 0 表示:N-0,为1时即表示:N-1 "
print(np.std(arr9,ddof=1)) # 2.7386127875258306
对数组某一维度上的数据进行计算:
# 也可以对某一轴方向上的数据进行统计计算
print(arr9.mean(axis=1)) # 水平方向
# [1. 4. 7.]
print(arr9.sum(0)) # 垂直方向
# [ 9 12 15]
print(arr9.sum(1)) # 水平方向
# [ 3 12 21]
布尔数组的统计计算:
用于统计的方法对布尔数组进行计算时,布尔数组中的值会被转化为1(True)和0(False)。
arr10 = np.random.randn(10)
print(arr10>0) # 生成一个布尔数组
# [ True False False True True False False True False True]
# 统计布尔数组中真值个数
print(np.sum(arr10>0)) # 5
# 测试布尔数组中是否存在真值
print(np.any(arr10>0)) # True
# 测试是否全为真值
print(np.all(arr10>0)) # False
利用上述特性,可用来快速检验数组对象的值。 如:
arr11 = np.array([[0,1,2],[3,4,5]])
print(arr11)
'''
[[0 1 2]
[3 4 5]]
'''
# 查找数组中大于 3 的个数
print(np.sum(arr11>3)) # 2
数组的集合运算:
常用的集合运算有交集、并集等,NumPy 也提供了实现这些功能的方法。
数组去重:
names = np.array(['bob','joe','will','bob','will','joe','joe'])
# 唯一值,去重
print(np.unique(names))
# ['bob' 'joe' 'will']
数组的交集及并集:
v1 = np.array([6,0,0,3,2,5,6])
v2 = np.array([2,3,6,7])
# 测试一个数组中的值是否存在于另外一个数组
print(np.in1d(v1,v2)) # v1 中的元素是否存在v2
# [ True False False True True False True]
# 计算公共元素,交集
print(np.intersect1d(v1,v2))
# [2 3 6]
# 计算并集
print(np.union1d(v1,v2))
# [0 2 3 5 6 7]
数组的排序:
arr12 = np.array([1,3,-1,5,0,8,2,-3,-5])
print(np.sort(arr12))
# [-5 -3 -1 0 1 2 3 5 8]
# 多维数组的排序
arr7 = np.random.rand(5,3)
arr7.sort(1)
print(arr7)
'''
[[0.34171176 0.36656582 0.39521288]
[0.10261016 0.72106677 0.82253822]
[0.63797554 0.97793818 0.99053419]
[0.90611274 0.93980694 0.95973721]
[0.44387456 0.77680543 0.87764262]]
'''
文件读写方法:
npy、npz 文件读写方法:
npy 与 npz 文件是 NumPy 模块特有的文件格式,可直接储存数组对象,并可以非常快速方便的被读取。
保存方法:
# 保存数组文件为.npy格式
arr = np.arange(10)
np.save('test_array',arr)
# 读取npy文件
arr_load = np.load('test_array.npy')
print(arr_load) # [0 1 2 3 4 5 6 7 8 9]
# 保存多个数组到一个文件中
arr_a = np.arange(5)
arr_b = np.arange(7)
# savez 方法 会生成一个npz文件
np.savez('test_arrs',a = arr_a, b = arr_b)
读取方法:
# 读取
arrs_load = np.load('test_arrs.npz')
print(arrs_load['a']) # [0 1 2 3 4]
print(arrs_load['b']) # [0 1 2 3 4 5 6]
txt 文件的读写
NumPy 模块除了特有的 npy 与 npz 文件读写外,还提供了常用的 txt 文件的读写功能。
有如下一个txt 文件:
将上面的 txt 文件读取为多维数组对象:
# 读取txt文件
arr1 = np.loadtxt('array_ex.txt',delimiter=',') # delimiter:分隔符
print(arr1)
'''
[[0.62860471 0.26776221 0.11522251 0.1357646 ]
[0.67807173 0.70582403 0.99541429 0.47682111]
[0.92778547 0.18151032 0.39027676 0.68568169]
[0.29354003 0.42026691 0.0184335 0.34545089]
[0.09503231 0.69471029 0.03176782 0.32063073]
[0.81750889 0.44511764 0.91480336 0.17254118]]
'''
# 将数组存储为txt文件
np.savetxt('array_ex2.txt',arr1)
结尾:
以上就是本篇博客的全部内容,感谢阅读。
该专栏着重介绍Python的科学计算、数据分析 NumPy 与 Pandas 模块的使用方法,并会结合统计学概念及数据分析相关方法对一些案例进行分析。
感兴趣的朋友,可以点个 关注 或 收藏 。如在博客中遇到任何问题或有一些想法、需求,可留言或私信。
创作不易,你的支持是我最大的动力,感谢 !
本文地址:https://blog.csdn.net/zhouz92/article/details/107417482
上一篇: 接口
下一篇: 荐 Python之深度学习入门