Python数据科学必备工具(一):科学计算库——Numpy

一、Numpy概述

NumPy(Numerical Python)是一个用于Python编程语言的开源库,主要用于科学计算和数据分析,可以快速处理任意维度的数组。它提供了一个强大的N维数组对象(ndarray)和多种用于数组操作的工具,成为许多其他科学计算库(如SciPy、Pandas、Matplotlib等)的基础。

二、Numpy的主要特性

1.N维数组对象

Numpy的核心是ndarray对象,它是一个多维数组,能够高效存储和处理大量数据。ndarray支持各种数据类型,包括整数、浮点数和复数等。

2.高效的数组运算

Numpy支持向量化运算,可以对整个数组进行操作,而不需要使用循环,这使得 运算速度显著提高。

3.广播功能

Numpy的广播机制允许不同形状的数组进行数学运算,使得数组操作更加灵活。

4.数学函数库

Numpy提供了丰富的数学函数,包括线性代数、傅里叶变换、随机数生成等,方便用户进行各种科学计算。

5.数学处理工具

Numpy支持数组的切片、索引和变形操作,用户可以方便地对数据进行处理和分析。

6.与其他库的兼容性

Numpy与其他科学计算库(如Pandas、Scipy、Matplotlib)等无缝集成,用户可以轻松地进行数据分析和可视化。

三、Numpy的安装

在终端里面使用pip轻松安装。

pip install numpy

针对不同的Python版本,可以安装相对应的Numpy版本。

Numpy与Python版本对应表
Numpy版本Python版本
1.24.x3.8 - 3.11
1.23.x3.7 - 3.10
1.22.x3.7 - 3.10
1.21.x3.6 -  3.9
1.20.x3.6 - 3.8
1.19.x3.5 - 3.8
1.18.x3.5 - 3.7
1.17.x3.5 - 3.7

四、Numpy的语法

1.Array数组:

# 导入Numpy包,并命名为np
import numpy as np

# 定义列表
wang_list = [1,2,3,4,5]

# 转换成array数组
wang_array = np.array(wang_list)

# 查看数组的类型
wang_array.dtype # 输出:int32

# 每个元素的字节大小
wang_array.itemsize # 输出:4,因为int32占用4字节

# 查看数组的结构
wang_array.shape # 输出:(5,)

# 查看元素个数
wang_array.size # 输出:5

# 数组的维度数量(即数组的“阶数”或“维数”)
wang_array.ndim

# 索引与切片
wang_array[0] # 输出:1。因为是输出的第一个数字
wang_array[1:3] # 输出:[2,3]。输出的是第二个和第三个数字,左闭右开。
wang_array[-2:] # 输出:[4,5]。输出的倒数第二个到最后一个数字。

2.数组结构:

# 导入Numpy包,并命名为np
import numpy as np

# 构建二维矩阵
wang_array = np.array([[1,2,3],[4,5,6],[7,8,9]])

# 复制数组
wang_array2 = wang_array.copy()

# 构建bool类型的数组
mask = np.array([0,0,0,1,1,1], dtype = bool)

3.数值运算:

# 导入Numpy包,命名为np
import numpy as np

# 构建一个二维数组
wang_array = np.array([[1,2,3],[4,5,6]])

# 里面所以元素的和
wang_array.sum(wang_array) # 输出:21

# 指定要进行的操作是沿什么轴(维度)
wang_array.sum(wang_array, axis = 0) # 输出:[5,7,9],对每一列进行求和
wang_array.sum(wang_array, axis = 1) # 输出:[6,15],对每一行进行求和

# 计算所有元素的乘积
wang_array.prod() # 输出:720
wang_array.prod(wang_array, axis = 0) # 输出:[4,10,18],对每一列进行求积
wang_array.prod(wang_array, axis = 1) # 输出:[6,120],对每一行进行求积

# 查看所有元素里面的最小值
wang_array.min() # 输出:1
wang_array.min(wang_array, axis = 0) # 输出:[1,2,3],求每一列的最小值
wang_array.min(wang_array, axis = 1) # 输出:[1,4],求每一行的最小值

# 查看所有元素里面的最大值
wang_array.max() # 输出:6

# 求最大值的索引值
wang_array.argmax() # 输出:5

注意:求索引值只要在函数前面加一个“arg”

# 求数组元素的平均值
wang_array.mean() # 输出:3.5

# 求数组元素的标准差
wang_array.std() # 输出:1.707825127659933

# 求数组元素的方差
wang_array.var() # 输出:2.9166666666666665

# 对数组的值做一个限制
# 小于2的值全部变成2, 大于4的值全部变成4
wang_array.clip(2,4) # 输出:[[2,2,3],[4,4,4]]

# 四舍五入
wang_array.round()

# 保留精度为1,保留一位小数
wang_array.round(decimals = 1)

4.排序操作:

# 导入Numpy包,命名为np
import numpy as np

# 构建一个小数二维数组
wang_array = np.array([[1.5,1.3,7.5],[5.6,7.8,1.2]])

# 把数组里面所有元素进行排序
np.sort(wang_array) # 输出:[[1.3,1.5,7.5],[1.2,5.6,7.8]]

# 排序后元素位置的索引值
np.argsort(wang_array) # 输出:[[1,0,2],[2,0,1]]

# 在0-10之间按平均差异构造10个数
wang_array = np.linspace(0,10,10) # 输出:[0.,1.11111111,2.22222222,3.33333333,
                                          4.44444444.5.55555556,6.66666667,7.77777778,
                                          8.88888889,10.    ]
# 构建一个数组values
values = np.array([2.5,6.5,9.5])

# 在wang_array中查找values元素的插入位置,返回一个索引数组,指示在数组中应该插入给定值的位置。
np.searchsorted(wang_array,values) # 输出:[3,6,9]

# 创建一个二维数组 wang_array,它的形状是 (4, 3),包含四行三列。
wang_array = np.array([1,0,6],
                      [1,7,0],
                      [2,3,1],
                      [2,4,0]])

# 第一列降序排序,第三列的值升序排序,返回索引值
index = np.lexsort([-1*wang_array[:,0],wang_array[:,2]]) # 输出:[0,1,3,2]

# 按照指定的排序规则进行排序
wang_array = wang_array[index] # 输出:[[2,4,0],
                                       [1,7,0],
                                       [2,3,1],
                                       [1,0,6]]



5.数组生成函数 

# 构造一个数组
np.arange(10) # 输出:[0,1,2,3,4,5,6,7,8,9]

np.arange(2,20,2) # 输出:[2,4,6,8,10,12,14,16,18]

np.arange(2,20,2, dtype=np.float32) # 输出:[2.,4.,6.,8.,10.,12.,14.,16.,18.]

# 构造一个包含 10 个数字的数组,这些数字在 0 和 10 之间均匀分布
np.linspace(0,10,10) # 输出:[0,1.11111111,2.22222222,3.33333333,
                             4.44444444,5.55555556,6.66666667,7.77777778,
                             8.88888889,10.]

# 构建一个包含5个数字的数组,在 1 到 10 之间对数均匀分布,默认是以10为底的
np.logspace(0,1,5) # 输出:[1.,1.77827941,3.16227766,5.62341325,10.]

6.四则运算

import numpy as np

x = np.array([5,5])
y = np.array([2,2])

# 对x,y两个数组进行逐元素相乘
np.multiply(x,y) # 输出:[10,10]

# 计算的是两个向量的点积。点积的计算方式是将对应元素相乘后求和
np.dot(x,y) # 输出:20 = 5*2 + 5*2

x = np.array([1,1,1])
y = np.array([1,1,1])

# 比较两个数组的元素是否相等,要求两个数组的元素个数相等
x == y # 输出:[True,True,True]

# 逻辑与运算
np.logical_and(x,y) # 用于对两个布尔数组进行逐元素的逻辑与运算,返回一个新的布尔数组

# 或
np.logical_or(x,y) # 输出:[True,True,True]

# 非
np.logical_not(x,y) # 输出:[0,0,0]

7.随机模块

# 生成一个形状为 (3, 2) 的数组,其中的元素是从均匀分布(范围在 [0, 1))中随机生成的浮点数
np.random.rand(3,2) # 输出:[[0.9866333,0.09269885],
                             [0.70162927,0.12834428],
                             [0.02000093,0.16113582]]

# 生成一个形状为 (5, 4) 的数组,其中的元素是从 0 到 9(包含 0,不包含 10)之间的随机整数
np.random.randint(10, size = (5,4)) # 输出:[[2 3 7 1]
                                             [5 0 4 8]
                                             [9 6 1 3]
                                             [0 2 5 7]
                                             [8 4 2 6]]

# 0-10之间随机生成三个整数
np.random.randint(0,10,3) # 输出:[2,3,5]

# 随机种子 
# 种子是一个整数,用于初始化随机数生成器,以确保每次运行代码时生成的随机数序列都是相同的。
np.random.seed(100)

8.文件读写

# 导入 NumPy 库,通常用作 np 的别名
import numpy as np

# 使用 Jupyter Notebook 的魔法命令 %%writefile 将以下文本写入名为 tang.txt 的文件。
# 文件内容是两行数字,数字之间用空格分隔。
%%writefile tang.txt
1 2 3 4 5 6
2 3 5 8 7 9

# 初始化一个空列表 data 用于存储读取的数据。
data = []

# 打开 tang.txt 文件,并将其赋值给变量 f。
with open('tang.txt') as f:

    # 逐行读取文件内容。
    for line in f.readlines():

        # 将每一行的字符串按空格分割成列表 fileds
        fileds = line.split()
        
        # 将分割出的字符串转换为浮点数,并存储在 cur_data 列表中。
        cur_data = [float(x) for x in fileds]

        # 将当前行的数据添加到 data 列表中。
        data.append(cur_data)

#  将列表 data 转换为 NumPy 数组。
data = np.array(data)

# 使用 np.loadtxt 函数直接从 tang.txt 文件中读取数据并将其转换为 NumPy 数组。
# 此方法自动处理文件的分隔符(默认为空格)。
data = np.loadtxt('tang.txt')

# 使用 %%writefile 将以下文本写入名为 tang2.txt 的文件。
# 文件内容是两行数字,数字之间用逗号分隔。
%%writefile tang2.txt
1,2,3,4,5,6
2,3,5,8,7,9

# 使用 np.loadtxt 从 tang2.txt 文件中读取数据,
# 指定 delimiter=',' 表示数据是用逗号分隔的。
# 读取的数据将被存储为 NumPy 数组。
data = np.loadtxt('tang2.txt',delimiter = ',')

# 再次使用 %%writefile 将新的内容写入 tang2.txt 文件。
# 现在文件的第一行是列名,后面是数据。
%%writefile tang2.txt
x,y,z,w,a,b
1,2,3,4,5,6
2,3,5,8,7,9

# 使用 np.loadtxt 从 tang2.txt 中读取数据,
# 指定 delimiter=',' 表示用逗号分隔,
# 同时使用 skiprows=1 跳过第一行(列名),只读取数据部分。
data = np.loadtxt('tang2.txt',delimiter = ',',skiprows = 1)

注意: 'tang2.txt':路径最好放到和代码一起
     skiprows : 去掉几行
     delimiter = ',' :分隔符
     usecols = (0,1,4) :指定使用哪几列

# 创建一个名为 tang_array 的 NumPy 数组,包含两行三列的整数。
tang_array = np.array([[1,2,3],[4,5,6]])

# 将 tang_array 数组保存到名为 tang4.txt 的文件中,
# 使用默认的分隔符(空格)
np.savetxt('tang4.txt',tang_array)

# 将 tang_array 数组保存到 tang4.txt 文件中,
# 使用格式化字符串 fmt='%d' 指定保存为整数格式。
np.savetxt('tang4.txt',tang_array,fmt='%d')

# 将 tang_array 数组保存到 tang4.txt 文件中,
# 使用格式化字符串 fmt='%d' 指定保存为整数格式,并使用逗号作为分隔符。
np.savetxt('tang4.txt',tang_array,fmt='%d',delimiter = ',')

# 将 tang_array 数组保存到 tang4.txt 文件中,
# 使用格式化字符串 fmt='%.2f' 指定保存为浮点数格式(保留两位小数),并使用逗号作为分隔符。
np.savetxt('tang4.txt',tang_array,fmt='%.2f',delimiter = ',')

9.数组保存

# 创建一个二维数组并保存为 .npy 文件
tang_array = np.array([[1,2,3],[4,5,6]])
np.save('tang_array.npy',tang_array)

# 加载之前保存的 .npy 文件
tang = np.load('tang_array.npy')

# 创建一个一维数组 tang_array2,该数组包含从 0 到 9 的整数(总共 10 个元素)。
tang_array2 = np.arange(10)

# 将 tang_array 和 tang_array2 保存为一个压缩的 .npz 文件,
# 文件名为 'tang.npz'
# tang_array 被命名为 'a',tang_array2 被命名为 'b'。
np.savez('tang.npz',a=tang_array,b=tang_array2)

# 加载之前保存的 .npz 文件,并将其内容赋值给变量 data
data = np.load('tang.npz')

# 查看 .npz 文件中的键
data.keys()

# 访问保存的数组 a
data['a']

# 访问保存的数组 b
data['b']

五、课后练习题

  1. 打印当前Numpy版本
  2. 构造一个全零的矩阵,并打印其占用的内存大小
  3. 打印一个函数的帮助文档,比如numpy.add
  4. 创建一个10-49的数组,并将其倒序排列
  5. 找到一个数组中不为0的索引
  6. 随机构造一个3*3矩阵,并打印其中最大与最小值
  7. 构造一个5*5的矩阵,令其值都为1,并在最外层加上一圈0
  8. 构建一个shape为(6,7,8)的矩阵,并找到第100个元素的索引值
  9. 对一个5*5的矩阵做归一化操作
  10. 找到两个数组中相同的值
  11. 得到今天 明天 昨天的日期
  12. 得到一个月中所有的天
  13. 得到一个数的整数部分
  14. 构造一个数组,让它不能被改变
  15. 打印大数据的部分值,全部值
  16. 找到在一个数组中,最接近一个数的索引
  17. 32位float类型和32位int类型转换
  18. 打印数组元素位置坐标与数值
  19. 按照数组的某一列进行排序
  20. 统计数组中每个数值出现的次数
  21. 如何对一个四维数组的最后两维来求和
  22. 交换矩阵中的两行
  23. 找到一个数组中最常出现的数字
  24. 快速查找TOP K
  25. 去除掉一个数组中,所有元素都相同的数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wq0455

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值