我是靠谱客的博主 昏睡百合,最近开发中收集的这篇文章主要介绍使用python可以实现科学计算吗_使用Python进行科学计算:NumPy入门,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

使用Python进行科学计算:NumPy入门

6a47d04d1dc8ac1715c1c941e88951fa.png

编程派微信号:codingpy编程

本文由 Python 翻译组 最新翻译出品,原做者为 Jamal Moir,译者为 cystone,并由编程派做者 EarlGrey 校对。这是使用 Python 进行科学计算的系列文章,上一篇可点此查看:Matplotlib 快速入门。数组

译者简介:cystone, 成都信息工程大学,计算机学院学生。擅长领域:图像处理,机器学习。微信

你能够用 NumPy 作不少有趣的事情。

机器学习

NumPy 是一个运行速度很是快的数学库,主要用于数组计算。它可让你在 Python 中使用向量和数学矩阵,以及许多用 C 语言实现的底层函数,你还能够体验到从未在原生 Python 上体验过的运行速度。ide

NumPy 是 Python 在科学计算领域取得成功的关键之一,若是你想经过 Python 学习数据科学或者机器学习,就必须学习 NumPy。我认为 NumPy 的功能很强大,并且入门也不难。函数

数组基础

建立数组

NumPy 的核心是数组(arrays)。具体来讲是多维数组(ndarrays),可是咱们不用管这些。经过这些数组,咱们能以闪电般的速度使用像向量和数学矩阵之类的功能。赶忙捡起你的线性代数吧!(只是开玩笑,其实并不须要不少复杂的数学知识)学习

# 1D Arraya = np.array([0, 1, 2, 3, 4])b = np.array((0, 1, 2, 3, 4))

c = np.arange(5)

d = np.linspace(0, 2*np.pi, 5)

print(a)  # >>>[0 1 2 3 4]print(b) # >>>[0 1 2 3 4]print(c) # >>>[0 1 2 3 4]print(d) # >>>[ 0.          1.57079633  3.14159265  4.71238898  6.28318531]print(a[3]) # >>>3

上边的代码展现了建立数组的四种不一样方式。最基本的方式是传递一个序列给 NumPy 的 array() 函数;你能够传给它任意的序列,不只仅是咱们常见的列表之类的。spa

注意,当输出的数组中的数值长度不同的时候,它会自动对齐。这在查看矩阵的时候颇有用。数组的索引和 Python 中的列表或其余序列很像。你也能够对它们使用切片,这里我再也不演示一维数组的切片,若是你想知道更多关于切片的信息,查看这篇文章。翻译

上边数组的例子给你展现了如何在 NumPy 中表示向量,接下来我将带大家领略一下怎么表示矩阵和多维数组。code

# MD Array,a = np.array([[11, 12, 13, 14, 15],[16, 17, 18, 19, 20],

[21, 22, 23, 24, 25],

[26, 27, 28 ,29, 30],

[31, 32, 33, 34, 35]])

print(a[2,4]) # >>>25

经过给 array() 函数传递一个列表的列表(或者是一个序列的序列),能够建立二维数组。若是咱们想要一个三维数组,那咱们就传递一个列表的列表的列表,四维数组就是列表的列表的列表的列表,以此类推。

注意二维数组是如何成行成列排布的(在咱们的朋友—空格的帮助下)。若是要索引一个二维数组,只须要引用相应的行数和列数便可。

背后的数学知识

为了更好的理解这些,咱们须要来看一下什么是向量和矩阵。

向量是一个有方向和大小的量,一般用来表示速度、加速度和动量等。向量能以多种方式书写,可是咱们最有用的方式是把它们写在有 n 个元素的元组里边,好比(1, 4, 6, 9)。这就是它们在 NumPy 中的表示方式。

矩阵和向量很像,除了它是由行和列组成的;更像一个网格(grid)。矩阵中的数值能够用它们所在的行和列来表示。在 NumPy 中,能够像咱们前面所作的那样,经过传递序列的序列来建立数组。

多维数组切片

多维数组切片比一维数组要复杂一点,同时它也是你在用 NumPy 的时候常常会用到的。

# MD slicingprint(a[0, 1:4]) # >>>[12 13 14]print(a[1:4, 0]) # >>>[16 21 26]print(a[::2,::2]) # >>>[[11 13 15]                              #     [21 23 25]#     [31 33 35]]print(a[:, 1]) # >>>[12 17 22 27 32]

就像你看到的同样,多维数组切片就是要分别在每一个维度上切片,并用逗号隔开。在二维数组中,第一个切片的含义是对行切片,第二个切片的含义是对列切片。

值得注意的是,你经过输入数字来指定行和列。上边第一个例子是从数组中选择第 0 行。(注:原文为第 0 列,应该是做者笔误)

下边的这幅图阐明了上边切片的例子的含义。

93e8c6e8d9a34f038e1d17cd385a0e81-1.jpg

数组属性

在使用 NumPy 时,你会想知道数组的某些信息。很幸运,在这个包里边包含了不少便捷的方法,能够给你想要的信息。

# Array propertiesa = np.array([[11, 12, 13, 14, 15],[16, 17, 18, 19, 20],

[21, 22, 23, 24, 25],

[26, 27, 28 ,29, 30],

[31, 32, 33, 34, 35]])

print(type(a)) # >>>print(a.dtype) # >>>int64print(a.size) # >>>25print(a.shape) # >>>(5, 5)print(a.itemsize) # >>>8print(a.ndim) # >>>2print(a.nbytes) # >>>200

如你所看,在上边的代码中 NumPy 的数组其实被称为 ndarray。我不知道为何它被称为 ndarray,若是有人知道请在下边留言!我猜想它是表示 n 维数组(n dimensional array)。

数组的形状(shape)是指它有多少行和列,上边的数组有五行五列,因此他的形状是(5,5)。

‘itemsize’ 属性是每个条目所占的字节。这个数组的数据类型是 int64,一个 int64 的大小是 64 比特,8 比特为 1 字节,64 除以 8 就获得了它的字节数,8 字节。

‘ndim’ 属性是指数组有多少维。这个数组有二维。可是,好比说向量,只有一维。

‘nbytes’ 属性表示这个数组中全部元素占用的字节数。你应该注意,这个数值并无把额外的空间计算进去,所以实际上这个数组占用的空间会比这个值大点。

使用数组

基本操做符

仅仅会赋值、取值和获得一些属性是不能知足你的需求的,有时候你还须要作一些数学运算。你能够利用基本的操做符实现这些,好比 +, -, /,等等。

# Basic Operatorsa = np.arange(25)a = a.reshape((5, 5))

b = np.array([10, 62, 1, 14, 2, 56, 79, 2, 1, 45,

4, 92, 5, 55, 63, 43, 35, 6, 53, 24,

56, 3, 56, 44, 78])b = b.reshape((5,5))

print(a + b)

print(a - b)

print(a * b)

print(a / b)

print(a ** 2)

print(a < b)

print(a > b)

print(a.dot(b))

除了 dot() 以外,这些操做符都是对数组进行逐元素运算。好比 (a, b, c) + (d, e,  f) 的结果就是 (a+d, b+e, c+f)。它将分别对每个元素进行配对,而后对它们进行运算。它返回的结果是一个数组。注意,当使用逻辑运算符好比 “” 的时候,返回的将是一个布尔型数组,这点有一个很好的用处,后边咱们会提到。

dot() 函数计算两个数组的点积。它返回的是一个标量(只有大小没有方向的一个值)而不是数组。

背后的数学知识

dot() 函数有时候也称为点积。理解这个函数的最好方法就是看下边它的计算过程。

eb377da0d339455c52a34235fa272926.png

数组的特定操做符

NumPy 还提供了一些其余颇有用的操做符,用于处理数组。

# dot, sum, min, max, cumsuma = np.arange(10)print(a.sum()) # >>>45print(a.min()) # >>>0print(a.max()) # >>>9print(a.cumsum()) # >>>[ 0  1  3  6 10 15 21 28 36 45]

很明显就能看出 sum()、min() 和 max() 函数的功能:将全部元素加起来,找到最小值和最大值。

cumsum() 函数就不是那么明显了。它像 sum() 那样把全部元素加起来,可是它的实现方式是,第一个元素加到第二个元素上,把结果保存到一个列表里,而后把结果加到第三个元素上,再保存到列表里,依次累加。当遍历完数组中全部元素则结束,返回值为运行数组的总和的列表。

cystone: 这里做者说的比较拗口,其实 cumsum() 就是一个累加计算而且保存每次累加的结果,返回值就是包含全部累加结果的一个列表。好比 np.array([1, 2, 3, 4, 5]).cumsum() = [1, 3, 6, 10, 15]

高级索引

花俏的索引

“花俏的索引”是获取数组中咱们想要的特定元素的有效方法。

# Fancy indexinga = np.arange(0, 100, 10)indices = [1, 5, -1]

b = a[indices] print(a) # >>>[ 0 10 20 30 40 50 60 70 80 90]print(b) # >>>[10 50 90]

如你所见,上边的例子中,咱们用想获取的索引的序列做为索引。它返回了咱们索引的元素。

布尔过滤(boolean masking)

布尔过滤是一个奇妙的特性,它容许咱们根据指定条件获取数组中的元素。

# Boolean maskingimport matplotlib.pyplot as plta = np.linspace(0, 2 * np.pi, 50)

b = np.sin(a)

plt.plot(a,b)

mask = b >= 0plt.plot(a[mask], b[mask], 'bo')

mask = (b >= 0) & (a <= np.pi / 2)

plt.plot(a[mask], b[mask], 'go')

plt.show()

上边的代码展现了实现布尔屏蔽。你须要作的就是传递给数组一个与它有关的条件式,而后它就会返回给定条件下为真的值。

上边的例子将会生成下边这幅图:

f5243f584ddf63a779397981c26e5076.png

咱们用条件式选择了图中不一样的点。蓝色的点(也包含图中的绿点,只是绿点覆盖了蓝点),显示的是值大于零的点。绿点显示的是值大于 0 小于 Pi / 2 的点。

缺省索引

缺省索引是从多维数组的第一维获取索引和切片便捷方法。例如,你有一个数组 a = [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]],那么 a[3] 将会返回数组第一维中索引值为 3 的元素,这里的结果是 4。

# Incomplete Indexinga = np.arange(0, 100, 10)b = a[:5] c = a[a >= 50]

print(b) # >>>[ 0 10 20 30 40]print(c) # >>>[50 60 70 80 90]

Where 函数

where() 函数是另一个根据条件返回数组中的值的有效方法。只须要把条件传递给它,它就会返回一个使得条件为真的元素的列表。

# Wherea = np.arange(0, 100, 10)b = np.where(a < 50)

c = np.where(a >= 50)[0]

print(b) # >>>(array([0, 1, 2, 3, 4]),)print(c) # >>>[5 6 7 8 9]

这就是 NumPy,不算太难,对吧?固然,这些只是一些基础,NumPy 还有不少其余的功能,若是你已经熟悉了这些基础内容,你能够去探索一下。

最后

以上就是昏睡百合为你收集整理的使用python可以实现科学计算吗_使用Python进行科学计算:NumPy入门的全部内容,希望文章能够帮你解决使用python可以实现科学计算吗_使用Python进行科学计算:NumPy入门所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部