数组是机器学习中使用的主要数据结构。
在 Python 中,NumPy 库中的数组,称为N 维数组或 ndarray,被用作表示数据的主要数据结构。
在本教程中,您将了解 NumPy 中的 N 维数组,用于在 Python 中表示数值和操作数据。
完成本教程后,您将了解:
- 什么是 ndarray 以及如何在 Python 中创建和检查数组。
- 用于创建新的空数组和带默认值的数组的关键函数。
- 如何组合现有数组以创建新数组。
通过我的新书《机器学习线性代数》启动您的项目,其中包括分步教程和所有示例的 Python 源代码文件。
让我们开始吧。

NumPy 在 Python 中 N 维数组简介
图片作者:patrickkavanagh,保留部分权利。
教程概述
本教程分为3个部分;它们是
- NumPy N 维数组
- 创建数组的函数
- 组合数组
在机器学习线性代数方面需要帮助吗?
立即参加我为期7天的免费电子邮件速成课程(附示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
NumPy N 维数组
NumPy 是一个 Python 库,可用于科学和数值应用程序,也是进行线性代数操作的工具。
NumPy 中的主要数据结构是 ndarray,它是 N 维数组的缩写。在使用 NumPy 时,ndarray 中的数据简称为数组。
它是一个内存中固定大小的数组,包含相同类型的数据,例如整数或浮点值。
数组支持的数据类型可以通过数组上的“dtype”属性访问。数组的维度可以通过“shape”属性访问,该属性返回一个描述每个维度长度的元组。还有许多其他属性。在此处了解更多信息
从数据或简单的 Python 数据结构(如列表)创建数组的一种简单方法是使用 array() 函数。
下面的示例创建了一个包含 3 个浮点值的 Python 列表,然后从该列表创建了一个 ndarray,并访问了数组的形状和数据类型。
1 2 3 4 5 6 7 |
# 创建数组 from numpy import array l = [1.0, 2.0, 3.0] a = array(l) print(a) print(a.shape) print(a.dtype) |
运行示例会打印 ndarray 的内容、形状(一个包含 3 个元素的一维数组)和数据类型(一个 64 位浮点数)。
1 2 3 |
[ 1. 2. 3.] (3,) float64 |
创建数组的函数
还有更方便的函数用于创建固定大小的数组,您可能会遇到或需要使用这些函数。
让我们看几个。您可以在此处查看完整列表。
空数组
empty() 函数将创建指定形状的新数组。
该函数的参数是一个数组或元组,指定要创建的数组的每个维度的长度。创建的数组的值或内容将是随机的,需要在使用前进行赋值。
下面的示例创建了一个空的 3×3 二维数组。
1 2 3 4 |
# 创建空数组 from numpy import empty a = empty([3,3]) print(a) |
运行示例会打印空数组的内容。您的特定数组内容会有所不同。
1 2 3 |
[[ 0.00000000e+000 0.00000000e+000 2.20802703e-314] [ 2.20803350e-314 2.20803353e-314 2.20803356e-314] [ 2.20803359e-314 2.20803362e-314 2.20803366e-314]] |
全零数组
zeros() 函数将创建一个指定大小的新数组,其内容填充为零值。
该函数的参数是一个数组或元组,指定要创建的数组的每个维度的长度。
下面的示例创建了一个 3×5 的零二维数组。
1 2 3 4 |
# 创建全零数组 from numpy import zeros a = zeros([3,5]) print(a) |
运行示例会打印创建的全零数组的内容。
1 2 3 |
[[ 0. 0. 0. 0. 0.] [ 0. 0. 0. 0. 0.] [ 0. 0. 0. 0. 0.]] |
全一数组
ones() 函数将创建一个指定大小的新数组,其内容填充为一值。
该函数的参数是一个数组或元组,指定要创建的数组的每个维度的长度。
下面的示例创建了一个包含 5 个元素的一维数组。
1 2 3 4 |
# 创建全一数组 from numpy import ones a = ones([5]) print(a) |
运行示例会打印创建的全一数组的内容。
1 |
[ 1. 1. 1. 1. 1.] |
组合数组
NumPy 提供了许多从现有数组创建新数组的函数。
让我们来看看您可能需要或遇到的两个最流行的函数。
垂直堆叠
给定两个或多个现有数组,您可以使用 vstack() 函数将它们垂直堆叠。
例如,给定两个一维数组,您可以通过垂直堆叠它们来创建一个新的二维数组,该数组具有两行。
这在下面的示例中进行了演示。
1 2 3 4 5 6 7 8 9 10 |
# 垂直堆叠 from numpy import array from numpy import vstack a1 = array([1,2,3]) print(a1) a2 = array([4,5,6]) print(a2) a3 = vstack((a1, a2)) print(a3) print(a3.shape) |
运行示例首先打印两个单独定义的一维数组。这些数组被垂直堆叠,形成一个新的 2×3 数组,其内容和形状也被打印出来。
1 2 3 4 5 6 7 8 |
[1 2 3] [4 5 6] [[1 2 3] [4 5 6]] (2, 3) |
水平堆叠
给定两个或多个现有数组,您可以使用 hstack() 函数将它们水平堆叠。
例如,给定两个一维数组,您可以创建一个新的、具有第一和第二数组列连接的一维数组或一行。
这在下面的示例中进行了演示。
1 2 3 4 5 6 7 8 9 10 |
# 水平堆叠 from numpy import array from numpy import hstack a1 = array([1,2,3]) print(a1) a2 = array([4,5,6]) print(a2) a3 = hstack((a1, a2)) print(a3) print(a3.shape) |
运行示例首先打印两个单独定义的一维数组。然后,这些数组被水平堆叠,形成一个包含 6 个元素的新一维数组,其内容和形状也被打印出来。
1 2 3 4 5 6 7 |
[1 2 3] [4 5 6] [1 2 3 4 5 6] (6,) |
扩展
本节列出了一些您可能希望探索的扩展本教程的想法。
- 尝试使用不同的方式创建数组,调整大小或使用新数据。
- 查找并开发 3 个用于创建数组的额外 NumPy 函数的示例。
- 查找并开发 3 个用于组合数组的额外 NumPy 函数的示例。
如果您探索了这些扩展中的任何一个,我很想知道。
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
书籍
- 用于数据分析的 Python, 2017.
- 优雅的 SciPy, 2017.
- NumPy 指南, 2015.
参考文献
API
- numpy.array() API
- numpy.empty() API
- numpy.zeros() API
- numpy.ones() API
- numpy.vstack() API
- numpy.hstack() API
总结
在本教程中,您了解了 NumPy 中的 N 维数组,用于在 Python 中表示和操作数值数据。
具体来说,你学到了:
- 什么是 ndarray 以及如何在 Python 中创建和检查数组。
- 用于创建新的空数组和带默认值的数组的关键函数。
- 如何组合现有数组以创建新数组。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
谢谢 Jason。张量乘法会是下一个吗?😉
我其实一直想知道为什么一维数组的形状不是 (3,1) 而是 (3,)
好问题。这确实与广播有关。我很快会有一篇关于这个主题的帖子。
解释得很好……期待更多!!!
谢谢。
嗨,Jason,
感谢您的这篇文章,解释得很清楚。
我是 numpy 的新手,我对为什么一维数组是 (3,) 而不是 (3,1) 感到有点困惑。您能给我指个方向吗,比如一篇文章或其他什么?
因为 (3,1) 会是一个二维数组,因为它指定了两个维度。
逻辑上,一维数组应该只是 (3),而不是 (3,)。那么 np.shape 缺少第二个值是否表示缺少第二个维度?我想知道为什么 np.shape 不会只返回 (3)。逗号似乎是我的困惑点。
非常感谢您的时间!
只指定了 1D。
如果是 2D,则为 (3,1)。
1D 的逗号可能是打印元组的产物。
这与指定单个元素元组的语法有关。
请参阅此参考资料
https://wiki.python.org/moin/TupleSyntax
谢谢。
如何将形状为 (5,7,10) 和 (5,7,12) 的两个 ndarray 连接起来,从而得到一个形状为 (5,7,22) 的数组?
我不确定这是否有意义。
嗨,Razan,
这正是您想要的。
a = numpy.random.random(size=(5,7,12))
b = numpy.random.random(size=(5,7,10))
c = numpy.concatenate([a,b], axis=2)
祝好,
艾伦。
如何将一维数组插入三维数组?
这真的取决于在 3D 数组中的位置。
通常,向一维数组添加额外的维度并使用 dstack/hstack/vstack 会得到您需要的结果。
对于使用数组的 Python 初学者来说,这是一个很棒的教程。
只是想知道您是否可以就如何完成以下任务提供一些见解
假设
old_array = (size=(10,10))
希望通过使用“old_array”中的元素并应用公式(例如 – cos(old_array[1,1]))来基于“old_array”创建一个新数组。
谢谢
您可以直接在数组和单个值之间执行减法。它将在数组上逐元素执行。
这是您的意思吗?
感谢您的非常有用的介绍……现在开始研究如何从一段声音文件中填充。
你这个数字恐惧症患者
杰夫
不客气。祝你好运!
当您有一个一维 numpy 数组 (10,) 时。这是否意味着 10 行而没有列?我们如何从行和列的角度来思考一维 numpy 数组?
在 numpy 中,(10,) 表示你有一个一维数组。如果你说行和列,你已经假定了一个二维数组。
但通常当你将一维数组应用于二维数组时,你可以像向量和矩阵一样操作,并且向量的行/列方向有时会被 numpy 奇迹般地纠正,以使你的操作成功。