第四章 NumPy——数据分析基础工具 🚀
本节课我们将深入学习NumPy,它是Python数据科学生态的基石。🧱
注记
NumPy为我们提供了强大的多维数组对象和快速的数值计算能力,是数据分析和机器学习的必备工具!💪
提示
让我们通过一个例子来直观感受一下NumPy的速度优势:
import numpy as np
import time
# Python列表
size = 1000000
list1 = list(range(size))
list2 = list(range(size))
start = time.time()
result_list = [(x + y) for x, y in zip(list1, list2)]
end = time.time()
print(f"Python列表耗时: {(end - start) * 1000:.2f} 毫秒")
# Numpy数组
array1 = np.arange(size)
array2 = np.arange(size)
start = time.time()
result_array = array1 + array2
end = time.time()
print(f"NumPy数组耗时: {(end - start) * 1000:.2f} 毫秒")
你会发现,对于大规模数据的运算,NumPy比Python列表快得多!🚀
提示
通常情况下,数据量越大,NumPy的优势越明显。
注记
可以说,NumPy是现代Python数据科学生态的核心。掌握NumPy,是进行高效数据处理和科学计算的关键!🔑
ndarray示意图
提示
上图展示了一个二维数组,它有2个轴(axis),形状(shape)为(3, 4),即3行4列。
属性 | 说明 |
---|---|
shape |
返回一个元组(tuple),表示ndarray各个维度的长度。元组的长度就是数组的维度(轴的个数,也称作秩rank)。元组中每个元素的值表示对应维度的大小。 |
ndim |
ndarray对象的维度(轴的个数,即秩)。 |
size |
ndarray中元素的总个数。 |
dtype |
ndarray中存储的元素的数据类型(如int32, float64等)。 |
itemsize |
ndarray中每个元素占用的字节数。 |
nbytes |
整个ndarray数组占用的总字节数 |
注记
通过这些属性,我们可以快速了解数组的结构、大小和数据类型。
让我们看一个例子:
我们可以使用多种方法创建ndarray:
函数 | 说明 |
---|---|
array |
将输入的序列类型数据(如列表、元组、其他ndarray等)转换为ndarray。如果未指定dtype,会自动推断。 |
asarray |
类似于array ,但如果输入已经是ndarray,则不会创建副本,而是直接引用。 |
arange |
类似于Python内置的range ,但返回的是ndarray而不是列表。可以指定起始值、终止值(不包含)和步长。 |
ones |
创建指定形状的全1数组。 |
ones_like |
以另一个ndarray的形状为模板,创建全1数组。 |
zeros |
创建指定形状的全0数组。 |
zeros_like |
以另一个ndarray的形状为模板,创建全0数组。 |
empty |
创建指定形状的未初始化数组(值不确定,可能是内存中的残留数据)。 |
empty_like |
以另一个ndarray的形状为模板,创建未初始化数组。 |
eye , identity |
创建N×N单位矩阵(对角线元素为1,其余为0)。 |
full |
创建指定形状,并用指定值填充的数组 |
full_like |
以另一个ndarray的形状为模板,创建指定填充值的数组 |
random |
NumPy的子模块,用于生成各种随机数组,包括:random.rand , random.randn , random.randint , random.uniform 等等 |
重要
np.array
会试图为创建的数组推断出一个合适的数据类型。
数据类型 | 类型代码 | 说明 |
---|---|---|
int8 , uint8 |
i1 , u1 |
有符号和无符号8位(1字节)整型 |
int16 , uint16 |
i2 , u2 |
有符号和无符号16位(2字节)整型 |
int32 , uint32 |
i4 , u4 |
有符号和无符号32位(4字节)整型 |
int64 , uint64 |
i8 , u8 |
有符号和无符号64位(8字节)整型 |
float16 |
f2 |
半精度浮点数(16位,2字节) |
float32 |
f4 或f |
单精度浮点数(32位,4字节),与C语言的float 兼容 |
float64 |
f8 或d |
双精度浮点数(64位,8字节),与C语言的double 和Python的float 对象兼容 |
float128 |
f16 或g |
扩展精度浮点数(128位,16字节) |
complex64 |
c8 |
复数,由两个32位浮点数表示 |
complex128 |
c16 |
复数,由两个64位浮点数表示 |
complex256 |
c32 |
复数,由两个128位浮点数表示 |
bool |
? |
布尔类型,存储True 或False |
object |
O |
Python对象类型 |
string_ |
S |
固定长度字符串类型(每个字符1字节)。例如,S10 表示长度为10的字符串。 |
unicode_ |
U |
固定长度Unicode类型(字节数取决于平台)。例如,U10 表示长度为10的Unicode字符串。 |
提示
我们可以使用dtype
属性查看或指定数组的数据类型。在创建数组时,可以使用dtype
参数指定数据类型。
注记
还可以使用astype
方法显式地转换数组的数据类型。
重要
astype
方法会创建一个新的数组(原始数组的副本),即使新的数据类型与原来的相同。
[]
和从0开始的下标。提示
如果只指定部分维度,返回的将是降维后的子数组。
:
表示整个轴。重要
与Python列表不同,NumPy数组的切片是原始数组的视图(view)。这意味着对切片的修改会直接影响原始数组!⚠️
提示
如果希望得到副本(copy)而不是视图,可以使用copy()
方法。
注记
布尔索引常用于根据条件筛选数据。
我们还可以在布尔索引中使用逻辑运算符&
(和), |
(或), ~
(非)来组合多个条件。
提示
花式索引可以用于按任意顺序选择或重排数组的行或列。
flat
属性(返回一个迭代器):+
, -
, *
, /
, **
等)。提示
理解广播规则对于高效使用NumPy非常重要。
可以参考如下图片来理解数组的广播:
让我们通过几个例子来理解广播:
重要
如果两个数组的形状不满足广播规则,会抛出ValueError
异常。
abs
, sqrt
, exp
, log
, sin
, cos
, tan
等。add
, subtract
, multiply
, divide
, power
, maximum
, minimum
等。注记
许多ufunc都有一个可选的out
参数,允许你指定结果存放的位置。
sum
, mean
, min
, max
, std
, var
, argmin
, argmax
等。axis
参数来沿着某个轴进行聚合。重要
当对多维数组进行聚合时,如果不指定axis
参数,会沿着所有轴进行聚合,得到一个标量值。如果指定了axis
参数,会沿着指定的轴进行聚合,得到一个降维的数组。
NumPy是Python数据科学的核心库,提供了高性能的多维数组对象ndarray
。
ndarray
具有多个重要属性,如shape
、ndim
、size
、dtype
等。
可以使用多种方法创建ndarray
,如array
、arange
、ones
、zeros
等。🛠️
NumPy支持多种数据类型,如整数、浮点数、复数、布尔值等。📊
ndarray
支持索引、切片、布尔索引、花式索引等多种数据访问方式。🔍
NumPy的广播机制允许在不同形状的数组之间进行算术运算。📡
通用函数(ufunc)提供了元素级的快速运算。⚙️
聚合函数可以对数组进行汇总计算。📊
你能总结一下NumPy数组(ndarray)与Python列表(list)的主要区别吗?
提示
你能举例说明NumPy的广播机制是如何工作的吗?
提示
例如,一个形状为(3, 3)的数组与一个形状为(3,)的数组相加,(3,)的数组会被广播到(3, 3)的每一行。
你能说出至少5种常见的NumPy通用函数(ufunc)吗?
提示
np.sqrt
, np.sin
, np.cos
, np.exp
, np.log
, np.add
, np.multiply
, np.maximum
等。
如何根据某个条件筛选NumPy数组中的元素?
提示
使用布尔索引。例如,arr[arr > 5]
会选择arr
中所有大于5的元素。
你觉得学习NumPy对你未来的数据分析或机器学习工作有何帮助?
提示
NumPy是数据分析和机器学习的基础工具,掌握NumPy可以提高数据处理的效率,为后续的学习打下基础。
邱飞 💌 [email protected]