欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-10-04 09:45:01
NumPy 快速入门:算数运算、统计计算、集合运算及文件读写方法介绍前言:简单算数运算方法:一元算数运算:二元算数运算:逻辑筛选 :NumPy 中的 where 方法:数组的修剪与压缩:统计计算方法:简单统计计算:布尔数组的统计计算:数组的集合运算:文件读写方法:npy、npz 文件读写方法:txt 文件的读写结尾:[【NumPy Pandas 数据分析】专栏](https://blog.csdn.net/zhouz92/category_10182623.html)前言:NumPy 模块作为 Pyth...

前言:

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 包含了很多其他的一元算数运算:

NumPy 快速入门:算数运算、统计计算、集合运算及文件读写方法介绍
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 快速入门:算数运算、统计计算、集合运算及文件读写方法介绍

逻辑筛选 :

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 文件:

NumPy 快速入门:算数运算、统计计算、集合运算及文件读写方法介绍
将上面的 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