一、NumPy介绍
在Python中,NumPy是一个开源的数值计算扩展库,用于高效地处理大型多维数组和矩阵,同时提供了大量的数学函数库进行这些数组的操作。
NumPy库在科学计算,数据分析,机器学习中有广泛应用。
二、安装NumPy
1 pip install numpy
2.1安装完NumPy后,你需要在Python脚本中导入它才能使用:

==============
插入
ndarray数组的元素类型

三、Numpy数组基础
最重要的一个特点就是其N维数组对象ndarray,该对象是一个快速而灵活的大数据集容器。你可以利用这种数组对整块数据执行一些数学运算,其语法跟标量元素之间的运算一样。
1 numpy.array(): 从现有数据创建数组。 2 3 numpy.zeros(): 创建指定形状的全零数组。 4 5 numpy.ones(): 创建指定形状的全一数组。 6 7 numpy.full(): 创建指定形状且填充特定值的数组。 8 9 numpy.arange(): 创建具有给定间隔的均匀间隔的值。 10 11 numpy.linspace(): 创建指定间隔内的等间隔数字。 12 13 numpy.eye(): 创建单位矩阵或对角矩阵。
创建数组: Numpy允许使用array函数从列表创建数组
1 import numpy as np 2 3 # 创建一维数组 4 arr1 = np.array([1, 2, 3]) 5 print(f'arr1:\n{arr1}') 6 7 # 创建二维数组 8 arr2 = np.array([[1, 2, 3], [4, 5, 6]]) 9 print(f'arr2:\n{arr2}') 10 11 # 使用np.zeros创建0数组,3*3的二维数组 12 arr3 = np.zeros((3, 3)) 13 print(f'arr3:\n{arr3}') 14 15 # 三维数组, 16 arr4 = np.zeros((2, 3, 4)) 17 print(f'arr4:\n{arr4}') 18 19 20 21 ========================== 22 那怎么去区分几维数组讷 23 24 1.数组的形状(shape): 25 26 一维数组的形状是一个包含单个元素的元组,例如 (n,),表示有n个元素。 27 二维数组的形状是一个包含两个元素的元组,例如 (m, n),表示有m行和n列。 28 三维数组的形状是一个包含三个元素的元组,例如 (p, m, n),表示有p个二维数组,每 个数组有m行和n列。 29 以此类推,更高维数组也遵循这个结构。 30 31 2.数组的结构: 32 33 一维数组是一串值,按线性排列。 34 二维数组看起来像一个表格或矩阵,包含多行多列。 35 三维数组可以想象成一组二维数组的集合(例如一个立方体)。 36 更高维的数组则在此基础上进一步扩展。 37 38 3.使用 NumPy 的 ndim 属性: 在 NumPy 中,可以使用 ndim 属性来获取数组的维度。例如: 39 40 print(arr1.ndim) 41 print(arr2.ndim) 42 print(arr3.ndim)


3.2 数组索引和切片
NumPy数组的一个重要特性是它们支持多维索引和切片,这使得访问和修改数组的子集变得非常直观和高效。
array[index]: 通过索引访问数组中的单个元素。array[start:stop:step]: 使用切片访问数组的子集。array[indices]: 通过索引数组访问多个元素。
数组索引
索引用于访问数组中的单个元素。一维数组可以通过一个索引访问,多维数组则需要通过多个索引(每个维度一个)。

数组切片
切片用于访问数组的子集,通过指定起始索引、结束索引和步长来实现。

注意,在切片操作中,起始索引是包含在内的,而结束索引是不包含的。因此,arr[1:4] 实际上会获取索引为1、2和3的元素,而不包括索引为4的元素。
数组的属性:
数组有多个属性,如shape(形状)、size(大小)、ndim(数组维数)、reshape(返回一个新数组,该数组具有不同的形状但相同的数据)和dtype(数据类型)

3.3数组运算
提供了大量的函数来进行数组运算,包括数学运算、统计运算、线性代数运算等。数据计算的基本函数如下,详细介绍见后。

数学运算
1 # 加法 2 arr_add = np.array([1, 2, 3]) + np.array([4, 5, 6]) 3 print(arr_add) # 输出: [5 7 9] 4 5 # 乘法 6 arr_mul = np.array([1, 2, 3]) * np.array([4, 5, 6]) 7 print(arr_mul) # 输出: [ 4 10 18] 8 9 # 矩阵乘法 10 mat_mul = np.array([[1, 2], [3, 4]]) @ np.array([[5, 6], [7, 8]]) 11 print(mat_mul) # 输出: 12 # [[19 22] 13 # [43 50]]
统计运算
NumPy 提供了丰富的统计运算功能,允许用户计算数组的各种统计指标,如求和、平均值、中位数、最大值、最小值、标准差等。以下是一些常用的统计运算的语法和示例:
求和
1 import numpy as np 2 3 # 创建一个一维数组 4 a = np.array([1, 2, 3, 4, 5]) 5 6 # 计算数组元素的总和 7 sum_a = np.sum(a) 8 print("Sum of array a:", sum_a) # 输出: 15 9 10 # 创建一个二维数组 11 b = np.array([[1, 2, 3], [4, 5, 6]]) 12 13 # 计算二维数组所有元素的和 14 sum_b = np.sum(b) 15 print("Sum of array b:", sum_b) # 输出: 21 16 17 # 计算二维数组每列的和 18 sum_b_axis_0 = np.sum(b, axis=0) 19 print("Sum of each column in array b:", sum_b_axis_0) # 输出: [5 7 9] 20 21 # 计算二维数组每行的和 22 sum_b_axis_1 = np.sum(b, axis=1) 23 print("Sum of each row in array b:", sum_b_axis_1) # 输出: [ 6 15]
平均值(Mean)
使用 numpy.mean() 函数可以计算数组元素的平均值。
1 import numpy as np 2 3 # 创建一个一维数组 4 a = np.array([1, 2, 3, 4, 5]) 5 6 # 创建一个二维数组 7 b = np.array([[1, 2, 3], [4, 5, 6]]) 8 9 10 # 计算一维数组的平均值 11 mean_a = np.mean(a) 12 print("Mean of array a:", mean_a) # 输出: 3.0 13 14 # 计算二维数组每列的平均值 15 mean_b_axis_0 = np.mean(b, axis=0) 16 print("Mean of each column in array b:", mean_b_axis_0) # 输出: [2.5 3.5 4.5] 17 18 # 计算二维数组每行的平均值 19 mean_b_axis_1 = np.mean(b, axis=1) 20 print("Mean of each row in array b:", mean_b_axis_1) # 输出: [2. 5.]
中位数(Median)
使用 numpy.median() 函数可以计算数组元素的中位数。其实和求平均值差不多
最大值和最小值(Max and Min)
使用 numpy.max() 和 numpy.min() 函数可以分别计算数组元素的最大值和最小值。
1 import numpy as np 2 3 # 创建一个一维数组 4 a = np.array([1, 2, 3, 4, 5]) 5 6 # 创建一个二维数组 7 b = np.array([[1, 2, 3], [4, 5, 6]]) 8 9 # 计算一维数组的最大值和最小值 10 max_a = np.max(a) 11 min_a = np.min(a) 12 print("Max of array a:", max_a) # 输出: 5 13 print("Min of array a:", min_a) # 输出: 1 14 15 # 计算二维数组每列的最大值和最小值 16 max_b_axis_0 = np.max(b, axis=0) 17 min_b_axis_0 = np.min(b, axis=0) 18 print("Max of each column in array b:", max_b_axis_0) # 输出: [4 5 6] 19 print("Min of each column in array b:", min_b_axis_0) # 输出: [1 2 3] 20 21 # 计算二维数组每行的最大值和最小值 22 max_b_axis_1 = np.max(b, axis=1) 23 min_b_axis_1 = np.min(b, axis=1) 24 print("Max of each row in array b:", max_b_axis_1) # 输出: [3 6] 25 print("Min of each row in array b:", min_b_axis_1) # 输出: [1 4]
Nan的处理("Not a Number" (非数字)的缩写)
为了处理NaN值,NumPy提供了一些函数和方法。以下是一些例子:
1 import numpy as np 2 3 # 创建一个包含NaN的数组 4 arr = np.array([1, 2, np.nan, 4, 5]) 5 6 # 检查数组中的NaN值 7 has_nan = np.isnan(arr) 8 print(has_nan) # 输出: [False False True False False]
去除NaN值
如果想要去除数组中的NaN值,可以使用numpy.nan_to_num()函数,它将NaN值替换为指定的值(默认为0)
1 # 创建一个包含NaN的数组 2 arr = np.array([1, 2, np.nan, 4, 5]) 3 4 # 将NaN替换为0 5 arr_no_nan = np.nan_to_num(arr) 6 print(arr_no_nan) # 输出: [1. 2. 0. 4. 5.]
忽略NaN值的统计运算
在进行统计运算时,可能想要忽略NaN值。例如,numpy.nanmean()函数会计算数组中所有非NaN值的平均值。
1 # 创建一个包含NaN的数组 2 arr = np.array([1, 2, np.nan, 4, 5]) 3 4 # 计算忽略NaN值的平均值 5 mean_value = np.nanmean(arr) 6 print(mean_value) # 输出: (1 + 2 + 4 + 5) / 4 = 3.0
安全地进行数组运算
在进行数组运算时,如果有一个数组包含NaN值,那么结果可能也会是NaN。为了避免这种情况,你可以使用numpy.nansum()(求和)、numpy.nanprod()(求积)、numpy.nanmax()(最大值)、numpy.nanmin()(最小值)等函数,它们都会忽略NaN值。
堆叠:
stack函数可以沿着新的轴加入一系列的数组。
1 堆叠(Stacking)在数据科学和机器学习领域,尤其是在处理多维数组或张量时,通常指的是将多个数组或矩阵沿着某个新的轴组合成一个更大的数组或张量的过程。这个过程类似于将书籍或纸张堆叠在一起,但在这里我们是在数学或编程的上下文中操作数组或矩阵。 2 3 在NumPy库中,堆叠可以通过多种函数实现,具体取决于你想要如何组合这些数组: 4 5 np.stack():允许指定沿着哪个轴进行堆叠。如果没有指定轴(axis),它默认会在最前面增加一个新的轴。这个函数非常灵活,因为它允许我们控制堆叠的方向 6 7 np.vstack():用于垂直堆叠(按行堆叠)数组。它要求输入的数组必须具有相同的列数,但行数可以不同。堆叠后的数组将具有所有输入数组的行数之和作为行数,列数与输入数组的列数相同 8 9 np.dstack():用于沿着深度轴堆叠数组,通常用于堆叠图像的不同颜色通道(例如,RGB图像的红色、绿色和蓝色通道)。它要求输入的数组必须具有相同的尺寸,除了堆叠的轴之外。 10 11 np.concatenate():虽然这不是一个专门用于堆叠的函数,但它可以用来沿着指定的现有轴连接相同形状的数组或数组序列。与np.stack()不同,np.concatenate()不会增加新的轴,而是沿着一个已存在的轴进行连接。

分割:split函数可以将一个数组分割成多个子数组。
1 import numpy as np 2 3 d = np.array([1, 2, 3, 4, 5, 6]) 4 e, f = np.split(d, [3]) 5 print(e) # [1 2 3] 6 print(f) # [4 5 6] 7 8 9 np.split(d, [3]) 调用了np.split()函数,尝试将数组d在索引3处分割成两个子数组。由于np.split()的第二个参数是一个列表(或单个整数,但在这里被当作列表处理),其中包含了分割点的索引,因此它会在索引3之前停止分割第一个子数组,并将从索引3开始(包括索引3)的所有元素分配给第二个子数组
四、高级特性
掩码数组:掩码数组是Numpy中的一种特殊数组,它可以让你隐藏或“掩码”数组中的某些数据。

五、实例:使用Numpy解决问题
- 实际案例:假设我们是数据分析师,需要分析一组股票价格的数据,找出价格最高的股票和计算所有股票价格的平均值。
- 1.数据准备: 首先,我们创建一个包含股票价格的Numpy数组。
1 import numpy as np 2 stock_prices = np.array([120.5, 90.3, 45.8, 150.1, 180.4])
2.分析:找出价格最高的股票:
1 max_price = np.max(stock_prices) 2 max_index = np.argmax(stock_prices) 3 print(f"最高股票价格为:{max_price}, 位于索引:{max_index}")
3.计算所有股票价格的平均值:
1 average_price = np.mean(stock_prices) 2 print(f"股票价格的平均值为:{average_price}")

浙公网安备 33010602011771号