NumPy中的数据

NumPy 简介

Python 很方便,但也会很慢。不过,它允许你访问执行用 C 等语言编写的代码的库。NumPy 就是这样一个库:它为 Python 中的数学运算提供了一个更快速的替代方案,可以与数字组高效搭配使用 - 如矩阵。

NumPy 是一个很大型的库,我们在这里只讲一些皮毛。如果你打算用 Python 进行很多的数学计算, 则很有必要花一些时间阅读这篇文档 以了解更多。

导入 NumPy

在导入 NumPy 库时,大多数情况下(包括这里)你会看到的一个约定,是将其命名为 np,像这样:

import numpy as np

现在,你可以给函数和类型名称加上前缀 np. 来使用该库,你会在下面的示例中看到。

数据类型和形状

NumPy 中处理数字的最常见方式是通过 ndarray 对象。它们与 Python 列表相似,但是可以有任意数量的维度。而且,ndarray 支持快速的数学运算,这正是我们想要的。

由于它可以存储任意数量的维度,你可以使用 ndarray 来表示我们之前提到的任意数据类型:标量、向量、矩阵或张量。

标量

NumPy 中的标量 比 Python 中的标量类型更多。不像 Python 只有基本类型 intfloat 等,NumPy 可以让你指定有符号和无符号的类型以及不同的大小。因此,除了 Python 的 int,你可以使用 uint8int8uint16int16 等类型。

这些类型很重要,因为你所创建的每个对象(向量、矩阵、张量)最终都会存储标量。而且,当你创建 NumPy 数组时,可以指定类型 - 但是数组中的每一项必须具有相同的类型。在这方面,NumPy 数组更像是 C 数组,而非 Python 列表。

如果要创建一个包含标量的 NumPy 数组,方法是将值传递给 NumPy 的 array 函数,如下所示:

s = np.array(5)

不过你仍然可以在 ndarray、NumPy 标量和普通的 Python 标量之间执行数学运算,你将在元素级数学运算课程中看到。

你可以通过检查数组的 shape 属性来查看数组的形状。你可以执行代码

s.shape

它会打印出结果,即一对空括号 ()。这表示它的维度为零。

即使标量位于数组中,你仍然可以像正常标量一样使用它们。你可以键入:

x = s + 3

x 现在将等于 8。如果你检查 x 的类型,会发现它可能是 numpy.int64,因为它在使用 NumPy 类型,而不是 Python 类型。

顺便说一下,即使标量类型也支持大部分的数组函数。所以你可以调用 x.shape,它会返回 (),因为它的维度为零,即使它不是数组。如果你使用普通的 Python 标量来尝试,就会收到一个错误。

向量

要创建一个向量,你可以将 Python 列表传递给 array 函数,像这样:

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

如果你检查向量的 shape 属性,它将返回表示向量的一维长度的单个数字。在上面的示例中,v.shape 会返回 (3,) 。

现在有了数字,你可以看到 shape 是一个元组,其中包含每个 ndarray 的维度的大小。对于标量,它只是一个空的元组,但是向量有一个维度,所以元组包含一个数字和一个逗号。(Python 不能将 (3) 理解为具有一个项的元组,所以它需要逗号。你可以在此处 阅读有关元组的更多信息)

你可以使用索引访问向量中的元素,如下所示:

x = v[1]

现在 x 等于 2

NumPy 还支持高级索引技术。例如,要访问第二个元素及其后面的项,你可以这样写:

v[1:]

然后它会返回数组 [2, 3]。NumPy 切片功能非常强大,允许你访问 ndarray 中的任何项目组合。但它有时也会有点复杂,你可以在此文档中阅读更多详情。

矩阵

使用 NumPy 的 array 函数创建矩阵,跟创建向量一样。但是,这次你不只是传入一个列表,而是提供列表的列表,其中每个列表代表一行。所以要创建一个包含数字 1 到 9 的 3x3 矩阵,你可以这样做:

m = np.array([[1,2,3], [4,5,6], [7,8,9]])

检查它的 shape 属性将返回元组 (3, 3),表示它有两个维度,每个维度的长度为 3。

你可以像向量一样访问矩阵的元素,但要使用额外的索引值。所以要在上面的矩阵中找到数字 6,你可以访问 m[1][2]

张量

张量与向量和矩阵一样,但张量可以有更多的维度。例如,要创建一个 3x3x2x1 的张量,你可以这样做:

t = np.array([[[[1],[2]],[[3],[4]],[[5],[6]]],[[[7],[8]],\
    [[9],[10]],[[11],[12]]],[[[13],[14]],[[15],[16]],[[17],[17]]]])

而 t.shape 会返回 (3, 3, 2, 1)

你可以像在矩阵中一样访问其中的项目,但需要使用更多的索引。所以 t[2][1][1][0] 将返回 16

更改形状

有时,你需要更改数据的形状,而无需实际更改其内容。例如,你可能有一个一维的向量,但是需要一个二维的矩阵。实现它的方式有两种。

假设你有以下向量:

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

调用 v.shape 会返回 (4,)。但如果你想要一个 1x4 矩阵呢?你可以使用 reshape 函数,就像这样:

x = v.reshape(1,4)

调用 x.shape 会返回 (1,4)。如果你想要一个 4x1 矩阵,可以这样做:

x = v.reshape(4,1)

reshape 函数不只是添加大小为 1 的维度。查阅此文档 了解更多示例。

关于更改 NumPy 数组的形状还有一点:如果你看到经验丰富的 NumPy 使用者的代码,经常会看到他们使用一种特殊的切片语法,而不是调用 reshape。使用该语法,前面的两个示例会是这样的:

x = v[None, :]

或者

x = v[:, None]

这些代码创建一个切片,查看 v 的所有项目,要求 NumPy 为相关轴添加大小为 1 的新维度。你现在看起来可能觉得很奇怪,但它是一种常见的技术,所以了解它没什么坏处。


转自优达学城。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值