在数据科学的世界中,Numpy 是一个至关重要的工具。它为高效的数组运算和数值计算提供了强大的支持。本篇文章将详细介绍 Numpy 的基础用法,包括数组的创建、属性、索引和切片、变形、拼接、广播等操作。
背景
在之前的文章中,我们探讨了 Python 的基本数据类型、列表、元组、字典等基础数据结构。在数据科学领域,处理大规模数据是常见需求,而这些基础数据结构在效率和功能上往往难以满足需求。Numpy 提供了强大的多维数组对象 `ndarray`,以及丰富的库函数,极大地提升了数据处理的效率和方便性。
安装Numpy
在使用 Numpy 之前,确保你已经安装了它。你可以使用以下命令来安装:
pip install numpy
数组的创建
从列表创建
Numpy 数组可以通过 Python 的列表来创建,使用 np.array()
方法:
import numpy as np
l = [1, 2, 3, 4]
l_numpy = np.array(l)
print("List to numpy: ", l_numpy)
使用 Numpy 内置函数创建
Numpy 提供了多种内置函数来创建数组:
print("1: Np zeros: \n", np.zeros(10, dtype=int))
print("2: Np ones: \n", np.ones((3, 5), dtype=float))
print("3: Np full: \n", np.full((4, 2), 3.14))
print("4: Np linspace: ", np.linspace(0, 1, 5))
print("5: Np logspace: ", np.logspace(1, 2, 5))
print("6: Np diag: \n", np.diag(np.arange(4)))
print("7: Np eye: \n", np.eye(3))
print("8: Np empty: ", np.empty(3))
创建多维数组
Numpy 还可以创建多维数组:
l = [[1, 2], [3, 4]]
l_numpy = np.array(l)
print("Multidimensional: \n", l_numpy)
创建随机数组
使用 Numpy 生成随机数组:
print("1: Randomize [0, 1) \n", np.random.random((3, 3)))
print("2: Random integers [0, 10) \n", np.random.randint(0, 10, (3, 3)))
print("3: Random float [3, 5) \n", np.random.uniform(3, 5, (3, 3)))
print("4: Normal dist. with m=0 and std=1 \n", np.random.normal(0, 1, (3, 3)))
数组的属性
数组的维度、形状和大小
x1 = np.random.randint(10, size=6)
x2 = np.random.randint(10, size=(3, 4))
x3 = np.random.randint(10, size=(3, 4, 5))
print(f"Dim: X1: {x1.ndim}, X2: {x2.ndim}, X3: {x3.ndim}")
print(f"Shape: X1: {x1.shape}, X2: {x2.shape}, X3: {x3.shape}")
print(f"Len (but only first dim!): X1: {len(x1)}, X2: {len(x2)}, X3: {len(x3)}")
print(f"Size: X1: {x1.size}, X2: {x2.size}, X3: {x3.size}")
print(f"Dtype: X1: {x1.dtype}, X2: {x2.dtype}, X3: {x3.dtype}")
索引和切片
基本索引
print("1: X1: ", x1)
print("2: X1 first element: ", x1[0])
print("3: X1 first two elements: ", x1[:2])
print("4: X1 last element: ", x1[-1])
print("5: X1 last two element: ", x1[-2:])
多维数组访问
print("1: X2: \n", x2)
print("2: X2 default access row-wise: ", x2[0])
print("3: X2 first row, third col: ", x2[0, 2])
print("4: X2 first row, last col: ", x2[0, -1])
print("5: X2 every row, last two col: \n", x2[:, -2:])
print("6: X2 reversed: \n", x2[::-1, ::-1])
print("7: X2 last two rows, every even col: \n", x2[-2:, 1::2])
修改数组元素
x2[0, -1] = 99.013
print("Modified X2: \n", x2)
变形
简单变形
grid = np.arange(1, 10).reshape((3, 3))
print("Grid: \n", grid)
1D 到 2D
X = np.array([11, 22, 33, 44, 55]).reshape((-1, 1))
print("1D to 2D: \n", X)
使用 np.newaxis
X = np.arange(4)
row_vec = X[np.newaxis, :]
col_vec = X[:, np.newaxis]
print("Row vector: \n", row_vec)
print("Column vector: \n", col_vec)
使用 -1 进行变形
X = np.array([[[ 0, 1], [ 2, 3]], [[ 4, 5], [ 6, 7]], [[ 8, 9], [10, 11]], [[12, 13], [14, 15]]])
X = X.reshape(-1, 2)
print("3D to 2D using -1: \n", X)
拼接
合并数组
X = np.array([[11, 22], [33, 44], [55, 66]])
Y = np.array([[11, 22], [33, 44], [55, 66]])
print("Row concat: \n", np.concatenate([X, Y]))
print("Col concat: \n", np.concatenate([X, Y], axis=1))
vstack 和 hstack
print("Vstack (row-wise): \n", np.vstack((X, Y)))
print("Hstack (col-wise): \n", np.hstack((X, Y)))
广播
广播基本操作
a = np.ones((2, 3))
b = np.arange(3)
print("A + B: \n", a + b)
广播规则示例
a = np.arange(3).reshape((3,1))
b = np.arange(3)
print("A + B: \n", a + b)
掩码
使用布尔掩码
rng = np.random.RandomState(0)
x = rng.randint(10, size=(3, 4))
print("Values less than 4: ", x[x < 4])
argwhere 和 any
print("Argwhere: \n", np.argwhere(x < 4))
print("Any value ==0? ", np.any(x == 0))
花式索引
基本示例
a = np.random.randint(100, size=10)
print("Fancy indices: ", a[[0, 3, 5]])
多维数组的花式索引
X = np.arange(12).reshape((3, 4))
row_ix = np.array([0, 1, 2])
col_ix = np.array([2, 1, 3])
print("X[row_ix, col_ix]: ", X[row_ix, col_ix])
其他有用的功能
# 转置
X = np.arange(4).reshape((2,2))
print("X : \n", X)
print("X Transposed : \n", np.transpose(X))
# 展平
a = np.array([[1,2], [3,4]])
print("a.flatten() : ", a.flatten())
# 压缩
X = np.ones((3,1))
print("np.squeeze(X) : ", np.squeeze(X).shape)
# argwhere
X = np.arange(6).reshape(2,3)
print("np.argwhere(x>1) : \n ", np.argwhere(X>1))
# argmax
a = np.arange(6).reshape(2,3) + 10
print("np.argmax(a) : ", np.argmax(a))
# argsort
X = np.array([3, 1, 2])
print("np.argsort(X) : ", np.argsort(X))
结语
在这一篇文章中,我们详细介绍了如何创建和操作Numpy数组,包括创建、属性查询、索引和切片、重新整形、连接和堆叠、向量化、广播、掩码和花式索引等操作。Numpy是数据科学和机器学习中非常重要的工具,它提供了高效的数组运算和广泛的数学函数库。掌握Numpy的基本操作是进行更复杂的数据处理和分析的基础。
通过本文的学习,你应该已经熟悉了Numpy的基本用法,并能在实际数据处理过程中应用这些知识。希望这些内容能帮助你在数据科学的道路上打下坚实的基础。
在下一篇文章中,我们将深入探讨另一个强大的数据处理工具:Pandas。Pandas提供了更高级的数据结构和数据分析工具,使数据操作更加方便和高效。敬请期待!
如果你觉得这篇博文对你有帮助,请点赞、收藏、关注我,并且可以打赏支持我!
欢迎关注我的后续博文,我将分享更多关于人工智能、自然语言处理和计算机视觉的精彩内容。
谢谢大家的支持!