当前位置: 移动技术网 > IT编程>网页制作>HTML > NumPy 快速入门:算数运算、统计计算、集合运算及文件读写方法介绍

NumPy 快速入门:算数运算、统计计算、集合运算及文件读写方法介绍

2020年07月20日  | 移动技术网IT编程  | 我要评论

前言:

NumPy 模块作为 Python 的常用科学计算模块,其提供了大量的计算方法。本篇博客主要介绍 NumPy 的简单算数运算、统计计算、集合运算及文件读写方法。

本篇博客主要内容有:

  1. 简单算数运算;
  2. 逻辑筛选方法;
  3. 数组修建相关方法;
  4. 数组的集合运算及排序
  5. 文件读写方法。

简单算数运算方法:

简单算数运算常被分为两种:一元算数运算,二元算数运算。

一元算数运算:

一元算数运算指:接收运算元素为一个的算数运算,常见的有平方,平方根等。

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 from x or y depending on condition.

示例:

# 用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)

结尾:

以上就是本篇博客的全部内容,感谢阅读。

【Numpy Pandas 数据分析】专栏

该专栏着重介绍Python的科学计算、数据分析 NumPy 与 Pandas 模块的使用方法,并会结合统计学概念及数据分析相关方法对一些案例进行分析。

感兴趣的朋友,可以点个 关注收藏 。如在博客中遇到任何问题或有一些想法、需求,可留言或私信。

创作不易,你的支持是我最大的动力,感谢 !

本文地址:https://blog.csdn.net/zhouz92/article/details/107417482

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网