NumPy 核心指南:零基础入门与实践

NumPy 简介

NumPy(Numerical Python)是 Python 语言的一个扩展程序库,支持大量的多维数组及矩阵运算,此外也针对数组运算提供大量的数学函数库。

发展历史

NumPy 的前身 Numeric 早在 1995 年就诞生了,后来在 2005 年,Travis Oliphant 在 Numeric 的基础上创建了 NumPy,增加了对不同类型数据的支持等功能,使其成为目前 Python 数据科学领域中最重要、最基础的库之一。

重要地位

NumPy 是许多其他 Python 科学计算库(如 SciPy、Pandas、Matplotlib 等)的基础,它高效地处理多维数组的能力,让数据处理变得快捷而方便,为数据分析、机器学习等众多领域提供了强大的支持。

NumPy 数组基础

数组创建

一维数组
import numpy as np

arr = np.array([1, 2, 3, 4])

print(arr)

print(type(arr)) # <class 'numpy.ndarray'>

运行结果为:[1 2 3 4],输出的类型表明这是一个 NumPy 的多维数组对象(ndarray)。

二维数组
arr2 = np.array([[1, 2, 3], [4, 5, 6]])

print(arr2)

输出:

[[1 2 3]

[4 5 6]]
三维数组
arr3 = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])

print(arr3)

输出:

[[[1 2]

[3 4]]

[[5 6]

[7 8]]]

数组属性

ndim

表示数组的维度。

print(arr.ndim) # 1

print(arr2.ndim) # 2

print(arr3.ndim) # 3
shape

表示数组形状,即每个维度的大小。

print(arr.shape) # (4,)

print(arr2.shape) # (2, 3)

print(arr3.shape) # (2, 2, 2)
dtype

表示数组中元素的数据类型。

print(arr.dtype) # int64,具体类型可能因系统环境有所不同

arr4 = np.array([1.0, 2.0, 3.0])

print(arr4.dtype) # float64
size

表示数组元素个数。

print(arr.size) # 4

print(arr2.size) # 6

print(arr3.size) # 8

数组操作

切片与索引

一维数组索引和切片
arr = np.array([1, 2, 3, 4, 5])

print(arr[0]) # 1,取索引为 0 的元素

print(arr[1:4]) # [2 3 4],取索引 1 到 3 的元素
二维数组索引
arr2 = np.array([[1, 2, 3], [4, 5, 6]])

print(arr2[1, 2]) # 6,取第二行第三列元素

# 取第一行的所有元素

print(arr2[0, :]) # [1 2 3]

# 取所有行的第二列元素

print(arr2[:, 1]) # [2 5]

重塑数组

arr = np.array([1, 2, 3, 4, 5, 6])

arr2 = arr.reshape(2, 3)

print(arr2)

输出:

[[1 2 3]

[4 5 6]]

还可以将一维数组重塑为三维数组:

arr3 = arr.reshape(2, 1, 3)

print(arr3)

输出:

[[[1 2 3]]

[[4 5 6]]]

拼接与拆分数组

拼接数组
arr1 = np.array([1, 2, 3])

arr2 = np.array([4, 5, 6])

arr3 = np.concatenate((arr1, arr2))

print(arr3) # [1 2 3 4 5 6]

# 沿不同轴拼接二维数组

arr4 = np.array([[1, 2], [3, 4]])

arr5 = np.array([[5, 6], [7, 8]])

arr6 = np.concatenate((arr4, arr5), axis=0) # 沿行(轴 0)拼接

print(arr6)

输出:

[[1 2]

[3 4]

[5 6]

[7 8]]
arr7 = np.concatenate((arr4, arr5), axis=1) # 沿列(轴 1)拼接

print(arr7)

输出:

[[1 2 5 6]

[3 4 7 8]]
拆分数组
arr = np.array([1, 2, 3, 4, 5, 6])

arr1, arr2, arr3 = np.split(arr, 3) # 将数组平均拆分为 3 部分

print(arr1) # [1 2]

print(arr2) # [3 4]

print(arr3) # [5 6]

# 指定拆分位置

arr4, arr5 = np.split(arr, [2]) # 在索引 2 处拆分

print(arr4) # [1 2]

print(arr5) # [3 4 5 6]

数组运算

矢量化运算

arr1 = np.array([1, 2, 3])

arr2 = np.array([4, 5, 6])

print(arr1 + arr2) # [5 7 9]

print(arr1 - arr2) # [-3 -3 -3]

print(arr1 * arr2) # [4 10 18]

print(arr1 / arr2) # [0.25 0.4 0.5]

广播机制

arr = np.array([1, 2, 3])

print(arr + 2) # [3 4 5]

arr2 = np.array([[1, 2, 3], [4, 5, 6]])

print(arr2 + arr) # [[2 4 6][5 7 9]]

数组与矩阵运算

arr1 = np.array([1, 2, 3])

arr2 = np.array([4, 5, 6])

print(arr1.dot(arr2)) # 32,点积运算

arr3 = np.array([[1, 2, 3], [4, 5, 6]])

print(arr3.T) # [[1 4][2 5][3 6]],矩阵转置

NumPy 与 Python 列表的比较

内存效率示例

创建一个包含 1000 万个元素的列表和 NumPy 数组来比较内存占用。

import sys

list_data = list(range(10000000))

numpy_data = np.arange(10000000)

print(sys.getsizeof(list_data) * len(list_data)) # 列表内存占用(字节)

print(numpy_data.nbytes) # NumPy 数组内存占用(字节)

通常 NumPy 数组会比列表节省大量内存。

性能优势示例

对两个各含 1000 万个元素的列表和 NumPy 数组分别进行加法运算比较耗时。

import time

list1 = list(range(10000000))

list2 = list(range(10000000))

start_time = time.time()

list_result = [x + y for x, y in zip(list1, list2)]

list_time = time.time() - start_time

numpy1 = np.array(list1)

numpy2 = np.array(list2)

start_time = time.time()

numpy_result = numpy1 + numpy2

numpy_time = time.time() - start_time

print(f"列表运算耗时:{list_time}")

print(f"NumPy 数组运算耗时:{numpy_time}")

NumPy 数组运算通常会比列表循环快一两个数量级。

功能丰富示例

NumPy 提供大量的数学函数,比如计算数组的平方根等。

arr = np.array([1, 4, 9, 16])

print(np.sqrt(arr)) # [1. 2. 3. 4.]

而对 Python 列表进行同样的操作需要循环结合数学函数来实现。

NumPy 高级功能

布尔索引

arr = np.array([1, 2, 3, 4, 5])

bool_arr = arr > 2

print(bool_arr) # [False False True True True]

print(arr[bool_arr]) # [3 4 5]

# 更常用的写法

print(arr[arr > 2]) # [3 4 5]

随机数生成

# 生成随机整数

arr = np.random.randint(0, 10, (2, 3))

print(arr)

# 生成随机浮点数数组

arr_float = np.random.rand(3, 4) # 生成形状为(3,4)的浮点数数组,数值范围在[0,1)

print(arr_float)

# 生成符合正态分布的随机数数组

arr_normal = np.random.randn(2, 2) # 均值为0,方差为1的正态分布

print(arr_normal)

统计分析


arr = np.array([[1, 2, 3], [4, 5, 6]])

print(np.mean(arr)) # 3.5,整个数组的均值

print(np.mean(arr, axis=0)) # [2.5 3.5 4.5],按列求均值

print(np.mean(arr, axis=1)) # [2. 5.],按行求均值

print(np.median(arr)) # 3.5,中位数

print(np.std(arr)) # 标准差

文件读写

保存和加载 .npy 文件
arr = np.array([1, 2, 3])

np.save('arr.npy', arr)

loaded_arr = np.load('arr.npy')

print(loaded_arr)
文本文件读写
# 假设有一个文本文件 data.txt,内容如下:

# 1 2 3

# 4 5 6

# 7 8 9

arr = np.loadtxt('data.txt')

print(arr)

# 将数组保存为文本文件

np.savetxt('new_data.txt', arr)

通过以上详细介绍,初学者可以从基础到高级全面了解 NumPy 的知识和用法,为进一步学习数据分析等相关领域打下坚实基础。

以上内容全面介绍了 NumPy 的常用知识。你若觉得某些部分需要更详细的解释,或想补充其他相关内容,欢迎随时告知。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

古月฿

感谢您的支持,是创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值