NumPy简单入门教程

# NumPy简单入门教程

NumPy是Python中的一个运算速度非常快的一个数学库,它非常重视数组。它允许你在Python中进行向量和矩阵计算,并且由于许多底层函数实际上是用C编写的,因此你可以体验在原生Python中永远无法体验到的速度。

NumPy绝对是科学Python成功的关键之一,如果你想要进入Python中的数据科学和/或机器学习,你就要必须学习它。在我看来,NumPy的API设计得很好,所以我们要开始使用它并不困难。

这是一系列关于科学Python的文章中的第二篇,别忘了看看其他的哟(译者注:并不会放出所有的文章,只摘取部分文章)。

哇哦,你能让NumPy成为你的伙伴并且一起做的事真是太棒了 好吗。

# 数组基础

# 创建一个数组

NumPy围绕这些称为数组的事物展开。实际上它被称之为 ndarrays,你不知道没事儿。使用NumPy提供的这些数组,我们就可以以闪电般的速度执行各种有用的操作,如矢量和矩阵、线性代数等数学运算!(开个玩笑,本文章中我们不会做任何繁重的数学运算)

# 1D Array
a = 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

上面的代码显示了创建数组的4种不同方法。最基本的方法是将序列传递给NumPy的array()函数; 你可以传递任何序列(类数组),而不仅仅是常见的列表(list)数据类型。

请注意,当我们打印具有不同长度数字的数组时,它会自动将它们填充出来。这对于查看矩阵很有用。对数组进行索引就像列表或任何其他Python序列一样。 你也可以对它们进行切片,我不打算在这里切片一维数组,如果你想了解切片的更多信息,请查看这篇文章索引与切片 - NumPy 中文文档

上面的数组示例是如何使用NumPy表示向量的,接下来我们将看看如何使用多维数组表示矩阵和更多的信息。

# 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

为了创建一个2D(二维)数组,我们传递一个列表的列表(或者是一个序列的序列)给array()函数。如果我们想要一个3D(三维)数组,我们就要传递一个列表的列表的列表,如果是一个4D(四维)数组,那就是列表的列表的列表的列表,以此类推。

请注意2D(二维)数组(在我们的朋友空格键的帮助下)是如何按行和列排列的。要索引2D(二维)数组,我们只需引用行数和列数即可。

# 它背后的一些数学知识

要正确理解这一点,我们应该真正了解一下矢量和矩阵是什么。

矢量是具有方向和幅度的量。它们通常用于表示速度,加速度和动量等事物。向量可以用多种方式编写,尽管对我们最有用的是它们被写为n元组的形式,如(1,4,6,9)。这就是我们在NumPy中表示他们的方式。

矩阵类似于矢量,除了它由行和列组成; 很像一个网格。可以通过给出它所在的行和列来引用矩阵中的值。在NumPy中,我们通过传递一系列序列来制作数组,就像我们之前所做的那样。

# 多维数组切片

切片多维数组比1D数组复杂一点,并且在使用NumPy时你也会经常需要使用到。

# MD slicing
print(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]

如你所见,通过对每个以逗号分隔的维度执行单独的切片,你可以对多维数组进行切片。因此,对于2D数组,我们的第一片定义了行的切片,第二片定义了列的切片。

注意,只需输入数字就可以指定行或列。上面的第一个示例从数组中选择第0列。

下面的图表说明了给定的示例切片是如何进行工作的。

# 数组属性

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

# Array properties
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(type(a)) # >>><class ‘numpy.ndarray‘>
print(a.dtype) # >>>int64
print(a.size) # >>>25
print(a.shape) # >>>(5, 5)
print(a.itemsize) # >>>8
print(a.ndim) # >>>2
print(a.nbytes) # >>>200

正如你在上面的代码中看到的,NumPy数组实际上被称为ndarray。我不知道为什么他妈的它叫ndarray,如果有人知道请留言!我猜它代表n维数组。

数组的形状是它有多少行和列,上面的数组有5行和5列,所以它的形状是(5,5)。

itemsize属性是每个项占用的字节数。这个数组的数据类型是int 64,一个int 64中有64位,一个字节中有8位,除以64除以8,你就可以得到它占用了多少字节,在本例中是8。

ndim 属性是数组的维数。这个有2个。例如,向量只有1。

nbytes 属性是数组中的所有数据消耗掉的字节数。你应该注意到,这并不计算数组的开销,因此数组占用的实际空间将稍微大一点。

# 使用数组

# 基本操作符

只是能够从数组中创建和检索元素和属性不能满足你的需求,你有时也需要对它们进行数学运算。 你完全可以使用四则运算符 +、- 、/ 来完成运算操作。

# Basic Operators
a = 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()函数称为点积。理解这一点的最好方法是看下图,下图将表示它是如何进行计算的。

# 数组特殊运算符

NumPy还提供了一些别的用于处理数组的好用的运算符。

# dot, sum, min, max, cumsum
a = np.arange(10)

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

sum()、min()和max()函数的作用非常明显。将所有元素相加,找出最小和最大元素。

然而,cumsum()函数就不那么明显了。它将像sum()这样的每个元素相加,但是它首先将第一个元素和第二个元素相加,并将计算结果存储在一个列表中,然后将该结果添加到第三个元素中,然后再将该结果存储在一个列表中。这将对数组中的所有元素执行此操作,并返回作为列表的数组之和的运行总数。

# 索引进阶

# 花式索引

花式索引 是获取数组中我们想要的特定元素的有效方法。

# Fancy indexing
a = 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
import matplotlib.pyplot as plt

a = np.linspace(0, 2 * np.pi, 50)
b = np.sin(a)
plt.plot(a,b)
mask = b >= 0
plt.plot(a[mask], b[mask], ‘bo‘)
mask = (b >= 0) & (a <= np.pi / 2)
plt.plot(a[mask], b[mask], ‘go‘)
plt.show()

上面的示例显示了如何进行布尔屏蔽。你所要做的就是将数组传递给涉及数组的条件,它将为你提供一个值的数组,为该条件返回true。

该示例生成以下图:

我们利用这些条件来选择图上的不同点。蓝色点(在图中还包括绿点,但绿点掩盖了蓝色点),显示值大于0的所有点。绿色点表示值大于0且小于一半π的所有点。

# 缺省索引

不完全索引是从多维数组的第一个维度获取索引或切片的一种方便方法。例如,如果数组a=[1,2,3,4,5],[6,7,8,9,10],那么[3]将在数组的第一个维度中给出索引为3的元素,这里是值4。

# Incomplete Indexing
a = 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() 函数是另外一个根据条件返回数组中的值的有效方法。只需要把条件传递给它,它就会返回一个使得条件为真的元素的列表。

# Where
a = 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中你还可以做许多其他好玩的事情,当你已经熟悉了NumPy的基础知识,你就可以开始自由的探索NumPy的世界了。

# 最后别忘了分享这篇文章噢

要记得,不要忘了分享这篇文章,这样其他人就也可以看到了!另外,记得订阅这个博客的邮件列表,关注我的Twitter和Google+,这样你就不会错过任何有价值的文章了!

我会阅读所有的评论,如果你有什么想说的,想分享的,想问的或者喜欢的,请在下边留言!

# 文章出处

由NumPy中文文档翻译,原作者为 Ravikiran Srinivasulu,翻译至:https://www.pluralsight.com/guides/different-ways-create-numpy-arrays

原文地址:https://www.cnblogs.com/sogeisetsu/p/11369032.html

时间: 2024-09-30 21:00:18

NumPy简单入门教程的相关文章

程序员,一起玩转GitHub版本控制,超简单入门教程 干货2

本GitHub教程旨在能够帮助大家快速入门学习使用GitHub,进行版本控制.帮助大家摆脱命令行工具,简单快速的使用GitHub. 做全栈攻城狮-写代码也要读书,爱全栈,更爱生活. 更多原创教程请关注头条号.每日更新.也可以添加小编微信:fullstackCourse.一起交流,获取最新全栈教程信息.因为FQ原因,不能下载客户端的同仁,可以关注后回复“GitHub客户端”获取安装软件. 上篇教程:GitHub这么火,程序员你不学学吗? 超简单入门教程 干货 GitHub概念部分出现了一丝纰漏.为

iBatis简单入门教程

iBatis 简介: iBatis 是apache 的一个开源项目,一个O/R Mapping 解决方案,iBatis 最大的特点就是小巧,上手很快.如果不需要太多复杂的功能,iBatis 是能够满足你的要求又足够灵活的最简单的解决方案,现在的iBatis 已经改名为Mybatis 了. 官网为:http://www.mybatis.org/ 搭建iBatis 开发环境: 1 .导入相关的jar 包,ibatis-2.3.0.677.jar .mysql-connector-java-5.1.6

Swift简单入门教程:30分钟玩转Swift

通常来说,编程语言教程中的第一个程序应该在屏幕上打印“Hello, world”.在 Swift 中,可以用一行代码实现:    println("hello, world") 如果你写过 C 或者 Objective-C 代码,那你应该很熟悉这种形式——在 Swift 中,这行代码就是一个完整的程序.你不需要为了输入输出或者字符串处理导入一个单独的库.全局作用域中的代码会被自动当做程序的入口点,所以你也不需要main函数.你同样不需要在每个语句结尾写上分号. 这个教程会通过一系列编程

GitHub这么火,程序员你不学学吗? 超简单入门教程 【转载】

本GitHub教程旨在能够帮助大家快速入门学习使用GitHub. 本文章由做全栈攻城狮-写代码也要读书,爱全栈,更爱生活.原创.如有转载,请注明出处. GitHub是什么? GitHub首先是个分布式的版本控制库.通过使用git,可以方便的记录代码版本. 因国内外大量著名的项目,都开始搬迁到github.它又可以称为开源代码社区. github还是学习的好地方,学习优秀的代码. 可对其他项目中有bug的地方进行改进提交,集合众人的力量促进软件的优化改善. github何其火热,截至2015年2月

numpy简单入门学习

为了快速的学习numpy,只要参阅了官网的快速入门教程进行学习,官网的网址:https://docs.scipy.org/doc/numpy-dev/user/quickstart.html.虽然和matlab的操作大同小异,但是还是需要很多明确的python的概念,比如序列,列表以及元组的概念,当然这也是python里面需要注意最多的基本的数据类型.现将学习的基本过程叙述如下: numpy是通过python语言实现的用于科学研究中的计算.可以方便的进行代数计算.傅里叶计算等.这是Numpy学习

1. 最基本的爬虫~爬虫简单入门教程

一.什么是网络爬虫? 信息时代,每天我们都在上网,每天我们都在浏览器上访问网站,我们打开一个网页,接着又跳转到另一个网页,看到喜欢的内容,或者是一段幽默的句子,或者是一张美女的图片,我们会选择将其保存下来,当数量很多的时候,我们就会选择用程序来实现这样一个过程,实现自动浏览网页,自动根据我们的要求,保存我们想要的数据.于是,爬虫就应运而生了.所以,简单来说,爬虫就是实现网页自动浏览,数据自动保存,根据我们的需要进行自动化浏览器的操作或者自动化测试的这样一种程序.至于为啥要叫爬虫,因为互联网是一张

numpy基础篇-简单入门教程2

import numpy as np Array 数组 print(np.zeros((2, 2))) # [[0. 0.] [0. 0.]] print(np.ones((2, 2))) # [[1. 1.] [1. 1.]] print(np.full((2, 2), 7)) # [[7 7] [7 7]] print(np.eye(2)) # [[1. 0.] [0. 1.]] print(np.random.random((2, 2))) # [[0.67151478 0.6123482

numpy基础篇-简单入门教程3

np import numpy as np np.__version__ print(np.__version__) # 1.15.2 np.arange(10),创建一维数组 print(np.arange(10)) # [0 1 2 3 4 5 6 7 8 9] np.ones((2, 2), dtype=bool),创建布尔数组 print(np.full((2, 2), True, dtype=bool)) # [[ True True] [ True True]] print(np.o

GitHub这么火,程序员你不学学吗? 超简单入门教程 干货

本GitHub教程旨在能够帮助大家快速入门学习使用GitHub. 本文章由做全栈攻城狮-写代码也要读书,爱全栈,更爱生活.原创.如有转载,请注明出处. GitHub是什么? GitHub首先是个分布式的版本控制库.通过使用git,可以方便的记录代码版本. 因国内外大量著名的项目,都开始搬迁到github.它又可以称为开源代码社区. github还是学习的好地方,学习优秀的代码. 可对其他项目中有bug的地方进行改进提交,集合众人的力量促进软件的优化改善. github何其火热,截至2015年2月