目录
- 一、什么是NumPy
- 二、ndarray的限制
- 三、ndarray的属性
- 四、ndarray的创建方式
- [4.1 array() - 基于Python列表/元组创建](#4.1 array() - 基于Python列表/元组创建)
- [4.2 zeros()、ones()与zeros_like()、ones_like()](#4.2 zeros()、ones()与zeros_like()、ones_like())
- [4.3 full()与full_like()](#4.3 full()与full_like())
- [4.4 arange() - 数值范围生成数组](#4.4 arange() - 数值范围生成数组)
- [4.5 创建随机数数组](#4.5 创建随机数数组)
- 五、ndarray的数据类型
- 六、ndarray切片和索引
- [6.1 一维数组索引切片](#6.1 一维数组索引切片)
- [6.2 二维数组索引切片](#6.2 二维数组索引切片)
- [6.3 布尔索引](#6.3 布尔索引)
- [6.4 花式索引](#6.4 花式索引)
- 七、NumPy常用函数
- [7.1 基本数学函数](#7.1 基本数学函数)
- [7.2 统计函数](#7.2 统计函数)
- [7.3 比较函数](#7.3 比较函数)
- [7.4 排序函数](#7.4 排序函数)
- [7.5 去重函数](#7.5 去重函数)
- [8.1 算术运算(逐元素)](#8.1 算术运算(逐元素))
- [8.2 矩阵乘法](#8.2 矩阵乘法)
- [8.3 广播机制](#8.3 广播机制)
- 八、总结
CSDN标签:
#Numpy#Python数据分析#ndarray#科学计算
摘要:NumPy是Python数据分析的底层核心库,提供高性能多维数组对象ndarray。本文系统讲解ndarray限制、属性、多种数组创建方式、数据类型、切片索引、各类常用函数以及数组基础运算,附带可直接运行代码示例,适合数据分析入门学习查阅。
一、什么是NumPy
NumPy(Numerical Python)是Python科学计算的基础库。
- 核心对象 :ndarray(N‑dimensional array)多维数组,用来存储同类型大量数值数据。
- 优势 :
- 底层C语言实现,运算速度远快于Python原生列表
- 占用内存更小
- 支持向量化运算,不需要写循环
- 应用:Pandas、Matplotlib、机器学习库底层都依赖NumPy。
安装:
bash
pip install numpy
导入约定,几乎所有代码都这样写:
python
import numpy as np
二、ndarray的限制
ndarray 和 Python list 最大区别:
- 数组内所有元素必须是同一个数据类型。列表可以同时放数字、字符串、对象;ndarray不允许。如果传入不同类型,会自动向上强制转换。
python
import numpy as np
arr = np.array([1, 2, "3"])
print(arr) # 全部变成字符串类型
# 输出:['1' '2' '3']
-
维度固定,创建之后不能直接增减元素。原生list可以append动态增加;ndarray扩容需要生成新数组。
-
多维数组要求每一层维度长度一致,不能是参差不齐的"锯齿数组"。
坑点:传入参差不齐列表,不会报错,但数组类型变成object,性能会退化到普通Python列表,失去numpy速度优势。
python
# 不推荐,锯齿数组
bad_arr = np.array([[1, 2], [3]])
print(bad_arr) # [list([1, 2]) list([3])]
print(bad_arr.dtype) # object
三、ndarray的属性
创建数组后,常用属性获取数组信息:
| 属性 | 说明 |
|---|---|
arr.ndim |
数组维度,1维/2维/3维 |
arr.shape |
元组,每个维度的长度,如(3,4)代表3行4列 |
arr.size |
数组总元素个数 |
arr.dtype |
数组元素的数据类型 |
arr.itemsize |
单个元素占用字节大小 |
示例代码:
python
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr.ndim) # 2
print(arr.shape) # (2, 3)
print(arr.size) # 6
print(arr.dtype) # int64
print(arr.itemsize) # 8
四、ndarray的创建方式
4.1 array() - 基于Python列表/元组创建
python
import numpy as np
# 一维数组
a1 = np.array([1, 2, 3, 4])
# 二维数组
a2 = np.array([[1, 2], [3, 4]])
# 指定数据类型
a3 = np.array([1, 2, 3], dtype=np.float32)
print("一维数组:", a1)
print("二维数组:", a2)
print("指定float32类型:", a3)
4.2 zeros()、ones()与zeros_like()、ones_like()
zeros(shape):创建全0数组ones(shape):创建全1数组zeros_like(arr):参照传入数组的shape,生成同样形状全0数组ones_like(arr):参照传入数组的shape,生成同样形状全1数组
python
import numpy as np
z1 = np.zeros((2, 3)) # 2行3列全0
o1 = np.ones((3, 2)) # 3行2列全1
tmp = np.array([[1, 2, 3], [4, 5, 6]])
z_like = np.zeros_like(tmp) # 形状同tmp,全0
o_like = np.ones_like(tmp) # 形状同tmp,全1
print("zeros:", z1)
print("zeros_like:", z_like)
print("ones:", o1)
print("ones_like:", o_like)
4.3 full()与full_like()
创建全部填充指定数值的数组。
full(shape, fill_value):指定形状,全部赋值fill_valuefull_like(arr, fill_value):复制传入数组shape,全部赋值fill_value
python
import numpy as np
f1 = np.full((2, 3), 8) # 2行3列,全部填充8
temp_arr = np.array([[1, 2], [3, 4]])
f_like = np.full_like(temp_arr, 10) # 形状同temp_arr,全部填充10
print("full:", f1)
print("full_like:", f_like)
4.4 arange() - 数值范围生成数组
类似python内置range,但是返回ndarray,支持浮点数。
np.arange(start, stop, step) 左闭右开区间。
python
import numpy as np
a1 = np.arange(10) # 0‑9
a2 = np.arange(2, 10, 2) # 2, 4, 6, 8
a3 = np.arange(0, 2, 0.3) # 支持浮点数步长
print("0-9:", a1)
print("2-10步长2:", a2)
print("0-2步长0.3:", a3)
注意 :浮点数arange因为精度问题,不建议做精确终止,均匀采样优先使用
np.linspace()。
4.5 创建随机数数组
python
import numpy as np
# 设置随机种子,保证每次运行结果相同
np.random.seed(10)
# 0‑1之间均匀分布随机数
r1 = np.random.rand(2, 3)
# 标准正态分布(均值0,方差1)
r2 = np.random.randn(3, 3)
# 指定区间整数 [low, high)
r3 = np.random.randint(0, 10, size=(2, 2))
print("均匀分布:", r1)
print("标准正态分布:", r2)
print("随机整数:", r3)
五、ndarray的数据类型
常用dtype:
- 整数:
int8、int16、int32、int64 - 浮点数:
float16、float32、float64 - 布尔:
bool - 字符串:
str_
创建数组指定dtype:
python
arr = np.array([1, 2, 3], dtype=np.float32)
print(arr.dtype) # float32
类型转换使用.astype(),返回新数组,不会修改原数组。
python
arr = np.array([1.1, 2.2, 3.3])
arr2 = arr.astype(np.int32) # 浮点数转整数
print("原数组:", arr)
print("转换后:", arr2) # [1 2 3]
print("原数组不变:", arr) # [1.1 2.2 3.3]
⚠️ 注意:astype返回新数组,原数组不变;浮点数转整数直接截断小数,不是四舍五入。
六、ndarray切片和索引
重要特性 :numpy切片返回视图(view) ,修改切片会影响原数组,这和Python列表切片拷贝不一样!想要独立副本需要调用
.copy()。
6.1 一维数组索引切片
python
import numpy as np
arr = np.array([0, 1, 2, 3, 4, 5])
print(arr[2]) # 索引取值: 2
print(arr[1:4]) # 切片 [1, 2, 3]
print(arr[::2]) # 步长2: [0, 2, 4]
print(arr[-1]) # 最后一个元素: 5
6.2 二维数组索引切片
格式 arr[行, 列]
python
arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr2d[0, 1]) # 第0行第1列: 2
print(arr2d[0:2, :]) # 前两行,全部列
print(arr2d[:, 1]) # 全部行,第1列: [2 5 8]
print(arr2d[1:, 0:2]) # 第1行到最后,第0列到第1列
6.3 布尔索引
python
arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
cond = arr2d > 3
print("条件数组:", cond)
print("满足条件的元素:", arr2d[cond]) # [4 5 6 7 8 9]
6.4 花式索引
python
arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr2d[[0, 2]]) # 取第0行、第2行
print(arr2d[:, [0, 2]]) # 取第0列、第2列
重点 :切片得到视图,修改会改原数组;
arr_slice = arr[1:3].copy()创建独立副本。
七、NumPy常用函数
7.1 基本数学函数
python
import numpy as np
arr = np.array([1, 4, 9, 16])
print("平方根:", np.sqrt(arr)) # [1. 2. 3. 4.]
print("平方:", np.square(arr)) # [1 16 81 256]
print("e的x次方:", np.exp(arr)) # [2.71828183e+00 5.45981500e+01 8.10308393e+03 8.88611052e+06]
print("自然对数:", np.log(arr)) # [0. 1.38629436 2.19722458 2.77258872]
print("正弦:", np.sin(arr)) # [0.84147098 -0.7568025 0.41211849 -0.28790332]
print("余弦:", np.cos(arr)) # [0.54030231 -0.65364362 -0.91113026 -0.95765948]
print("绝对值:", np.abs([-1, -2, 3])) # [1 2 3]
7.2 统计函数
可指定axis按行/按列计算,axis=0按列;axis=1按行。
python
arr = np.array([[1, 2, 3], [4, 5, 6]])
print("全部求和:", np.sum(arr)) # 21
print("按列求和:", np.sum(arr, axis=0)) # [5 7 9]
print("按行求和:", np.sum(arr, axis=1)) # [6 15]
print("均值:", np.mean(arr)) # 3.5
print("最大值:", np.max(arr)) # 6
print("最小值:", np.min(arr)) # 1
print("标准差:", np.std(arr)) # 1.707825127659933
print("方差:", np.var(arr)) # 2.9166666666666665
print("中位数:", np.median(arr)) # 3.5
7.3 比较函数
逐元素比较,返回布尔数组。
python
arr = np.array([1, 3, 5, 7])
res = arr > 4
print("大于4:", res) # [False False True True]
# where条件判断
result = np.where(arr > 4, 10, 0) # 条件成立赋值10,否则0
print("where结果:", result) # [0 0 10 10]
7.4 排序函数
python
arr = np.array([3, 1, 4, 2])
# np.sort 返回排序后的新数组,不改变原数组
s = np.sort(arr)
print("排序后:", s) # [1 2 3 4]
print("原数组:", arr) # [3 1 4 2]
# arr.sort() 原地修改原数组
arr.sort()
print("原地排序后:", arr) # [1 2 3 4]
# 二维数组指定axis排序
arr2d = np.array([[3, 1], [2, 5]])
print("按行排序:", np.sort(arr2d, axis=1)) # [[1 3] [2 5]]
print("按列排序:", np.sort(arr2d, axis=0)) # [[2 1] [3 5]]
7.5 去重函数
np.unique()返回数组去重后排序结果。
python
arr = np.array([1,2,2,3,3,3])
u = np.unique(arr)
print(u)
8. 基本运算
numpy支持向量化运算,不需要循环,数组与标量、数组与数组直接运算符计算。
8.1 算术运算(逐元素)
python
import numpy as np
a = np.array([1, 2, 3, 4])
b = np.array([5, 6, 7, 8])
print("加法:", a + b) # [ 6 8 10 12]
print("减法:", a - b) # [-4 -4 -4 -4]
print("乘法:", a * b) # [ 5 12 21 32]
print("除法:", a / b) # [0.2 0.33333333 0.42857143 0.5]
print("幂运算:", a ** 2) # [ 1 4 9 16]
8.2 矩阵乘法
python
# 一维数组点积
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
print("点积:", np.dot(a, b)) # 32
# 二维数组矩阵乘法
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
print("矩阵乘法:", np.matmul(A, B)) # [[19 22] [43 50]]
print("等价写法:", A @ B) # [[19 22] [43 50]]
8.3 广播机制
当数组形状不同时,NumPy会自动扩展较小数组来匹配较大数组的形状。
python
# 标量与数组运算
arr = np.array([[1, 2, 3], [4, 5, 6]])
print("数组加标量:", arr + 10)
# 不同形状数组运算
a = np.array([[1, 2, 3], [4, 5, 6]])
b = np.array([10, 20, 30])
print("广播加法:", a + b) # b被广播到a的每一行
八、总结
NumPy的ndarray是Python科学计算的基石,掌握其核心特性对数据分析、机器学习至关重要:
- 高效性:C语言底层实现,向量化运算避免循环
- 一致性:数组元素类型必须相同,维度固定
- 丰富创建方式:array、zeros、ones、arange、随机数等
- 灵活索引:支持切片、布尔索引、花式索引
- 视图机制 :切片返回视图,修改会影响原数组,需要时使用
.copy() - 丰富函数库:数学、统计、排序等函数齐全
- 广播机制:简化不同形状数组的运算
建议读者在实际项目中多练习这些操作,结合Pandas、Matplotlib等库,构建完整的数据分析工作流。
python
# 综合示例:创建数组并计算统计信息
import numpy as np
# 创建随机数据
data = np.random.randn(100, 5) # 100行5列标准正态分布数据
# 计算每列的统计量
print("每列均值:", np.mean(data, axis=0))
print("每列标准差:", np.std(data, axis=0))
print("每列最大值:", np.max(data, axis=0))
print("每列最小值:", np.min(data, axis=0))
# 数据标准化
mean = np.mean(data, axis=0)
std = np.std(data, axis=0)
normalized_data = (data - mean) / std
print("标准化后数据形状:", normalized_data.shape)