NumPy 使处理数组变得简单。
如果你使用 Python,了解 Python NumPy 的一些基础知识是值得的。它对于处理数组非常有用,因为它非常快速和高效。它还包含许多方法,使操作和执行数组上的数值运算变得简单。
Python 中有许多数据结构,包括列表、字典、Pandas DataFrames,当然还有 NumPy 数组。每种结构都有其优点,知道何时使用其中一种可以节省编写程序的时间和精力。
在本文中,我们将向您展示 Python NumPy 的基础知识,并解释它为何如此有用。我们将为您提供一些示例,帮助您入门,并为您提供使数据分析项目更高效的基础。如果您有兴趣了解有关 Python 数据科学的更多信息,请考虑参加专 为没有 IT 经验的完全初学者设计的 课程
为什么使用 NumPy?
NumPy 中的数组与列表等其他数据结构有许多相似之处。它们可以存储数值数据和字符串,它们是可变的,并且可以以类似的方式进行切片和索引。但是,列表不能像数组那样轻松地处理数值运算。
要将数组中的所有元素乘以 2,请使用
array*2
,其中 array 是数组的名称。这称为矢量化。要对列表执行相同操作,需要 for 循环或列表推导,这两者都需要更多代码。此外,数组比列表快得多,并且它们消耗的内存要少得多,因为 NumPy 方法针对处理数组进行了高度优化。
Pandas 是另一个提供数据分析和可视化功能的不错的选择。Pandas 中的基本数据结构是
Series
,它类似于一维 NumPy 数组。但是,在执行数值计算时,NumPy 的速度更快、效率更高。有关使用 Pandas 的更多信息,请查看
本文
。我们还提供了一些关于
在 Pandas 中可视化时间序列数据
.
创建数组
NumPy 数组在创建时具有固定大小,并且元素必须具有相同的数据类型。这是创建数组时要牢记的两个主要约束。该
array()
函数包含以下参数:
numpy.array(object, dtype=None, *, copy=True, order='K', subok=False, ndmin=0, like=None)
为了简洁起见,我们不会详细描述所有参数。如果您对详细信息感兴趣,请查看文档
。
对于大多数应用程序,您只需要定义对象和可能的
dtype
参数。
要定义一维数组并打印其形状,请执行以下操作:
>>> import numpy as np
>>> ar = np.array([1, 2, 3, 4])
>>> print(ar.shape)
(4,)
对于 NumPy 多维数组,
object
采用嵌套序列的形式,其中各个序列定义数组的行。例如:
>>> ar = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
>>> print(ar.shape)
(2, 4)
NumPy 数组还可以保存不同的数据类型,例如整数、浮点数、字符串和布尔值。它甚至可以存储复数。我们可以将上面数组中的元素直接转换为字符串,如下所示:
>>> ar_string = ar.astype(str)
>>> ar_string
array([['1', '2', '3', '4'],
['5', '6', '7', '8']], dtype='
或者,我们可以
dtype=str
在定义数组时进行设置。可以按如下方式创建布尔值数组:
>>> np.array([[1, 1, 0, 0], [0, 1, 0, 1]], dtype=bool)
array([[True, True, False, False],
[False, True, False, True]])
如果您想屏蔽另一个数组中的某些值,这可能会很有用。
有多种方法可以定义一个数组,其中任意值作为占位符,以便稍后填充实际数据。
numpy.ones()
和
numpy.zeros()
函数分别创建一个用 1 和 0 填充的数组。
该
numpy.empty()
函数创建一个数组而不初始化条目。此特定函数要求用户手动设置数组中的所有值,应谨慎使用。但是,它可能比其他两个函数快一点。
要使用这些函数,需要指定数组的大小:
>>> np.zeros((3, 2))
array([[0., 0.],
[0., 0.],
[0., 0.]])
可以使用两个有用的 NumPy 函数定义具有固定序列的数组:
arange
和
linspace
。对于
arange
,您需要指定起始值和终止值以及步长。例如:
>>> np.arange(2, 20, 4)
array([ 2, 6, 10, 14, 18])
这类似于内置函数
range()
,可用于循环。有关
Python 中循环的更多详细信息,
本文
linspace
中的函数返回由起始值和终止值定义的间隔内均匀分布的数字。使用与上一个示例相同的参数可得出:
>>> np.linspace(2, 20, 4)
array([ 2., 8., 14., 20.])
此处,第三个参数定义要返回的值的数量,而不是像前一个示例中那样定义步长。要查看如何使用此函数为时间轴生成均匀分布的值的示例,请参阅
本文
。类似的函数
logspace
返回对数刻度上均匀分布的数字。尝试一下,看看会得到什么。
读取和写入 CSV
大多数情况下,您希望将文件中保存的数据读入 NumPy 数组。NumPy 附带一些函数来帮助加载和保存数组。这些函数专注于处理二进制数据或存储在文本文件中的数据。这两个函数
load()
提供
save()
将数组加载和保存到二进制文件的功能。
如果您正在使用文本文件(特别是 Python 中的 CSV),则读取和写入数组到文件的最佳方法是使用
loadtxt()
和
savetxt()
函数。后者有两个必需参数,
fname
和
X
,分别定义文件名和要保存的数组数据。要保存到 CSV,您还需要指定一个
delimiter
。为了演示这一点,让我们创建一个 2 x 4 数组,将其保存到 CSV,然后将其读回:
>>> ar = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
>>> np.savetxt('output_array.csv', ar, delimiter=',')
>>> ar_read = np.loadtxt('output_array.csv', delimiter=',')
>>> ar_read
array([[1., 2., 3., 4.],
[5., 6., 7., 8.]])
您也可以使用纯 Python 和内置
open()
函数。这里有
一篇
关于用 Python 写入文件的文章,向您展示了如何操作。如果您在 Python 中处理大量文件,这里有
一篇文章
,其中有一些关于如何以编程方式重命名文件的提示。
一些 NumPy 数组方法
现在我们已经介绍了在 Python 中创建数组的方法,让我们看看你可以用它做什么。NumPy 有许多有用且高度优化的方法,可让你执行数组操作并获取有关数组的其他信息。
正如我们在介绍中提到的,对数组执行基本运算(例如
array1 + array2
乘以标量)非常简单。对于线性代数,有一些有效的函数,例如用于计算点积或叉积或对数组进行转置。
一个常见的需求是汇总数组的内容。NumPy 包含用于计算统计数据的函数,例如平均值、中位数、标准差等。这些函数很有用,因为它们允许您指定一个轴来计算统计数据。默认情况下,统计数据是在扁平数组上计算的。例如:
>>> ar = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
>>> np.mean(ar)
4.5
>>> np.mean(ar, axis=0)
array([3., 4., 5., 6.])
>>> np.mean(ar, axis=1)
array([2.5, 6.5])
指定
axis=0
计算列的平均值,并
axis=1
计算行的平均值。现在我们知道如何生成汇总统计数据,我们可以找到行的平均值并将此信息附加到数组中的新列:
>>> row_mean = np.mean(ar, axis=1).reshape(2, 1)
>>> new_ar = np.append(ar, row_mean, axis=1)
>>> new_ar
array([[1., 2., 3., 4., 2.5],
[5., 6., 7., 8., 6.5]])
在这里,我们计算统计数据,重塑它,然后使用附加函数将其添加为新列。请注意,整个数组的数据类型已更改,因为我们的汇总统计数据是浮点数。
继续使用 NumPy
NumPy 是 Python 数据分析的基础工具。它是一个成熟的库,拥有大量有用的函数和方法,并且以速度和效率为核心。现在您已经了解了 Python NumPy 的基础知识,您可以使用在这里学到的知识来提高项目的效率。
可视化数据是数据科学过程中的重要一步。我们有两篇文章( 第 1 部分 和 第 2 部分 )介绍了如何在 Python 中使用 Matplotlib 进行绘图。
发表评论 取消回复