首页 > 其他分享 >收藏&下载 | 最全的NumPy 教程,没有之一

收藏&下载 | 最全的NumPy 教程,没有之一

时间:2023-01-02 13:31:43浏览次数:64  
标签:教程 示例 NumPy 最全 np 数组 print numpy


译者:飞龙     

https://www.tutorialspoint.com/numpy/index.htm

友情提示:本文较长,是教程的一部分,值得收藏,文末提供下载方式哦!觉得内容精彩一定要点一下“好看”哦!

NumPy - 简介

NumPy 是一个 Python 包。它代表 “Numeric Python”。它是一个由多维数组对象和用于处理数组的例程集合组成的库。

Numeric,即 NumPy 的前身,是由 Jim Hugunin 开发的。也开发了另一个包 Numarray ,它拥有一些额外的功能。2005年,Travis Oliphant 通过将 Numarray 的功能集成到 Numeric 包中来创建 NumPy 包。这个开源项目有很多贡献者。

NumPy 操作

使用NumPy,开发人员可以执行以下操作:

  • 数组的算数和逻辑运算。
  • 傅立叶变换和用于图形操作的例程。
  • 与线性代数有关的操作。NumPy 拥有线性代数和随机数生成的内置函数。

NumPy – MatLab 的替代之一

NumPy 通常与 SciPy(Scientific Python)和 Matplotlib(绘图库)一起使用。这种组合广泛用于替代 MatLab,是一个流行的技术计算平台。但是,Python 作为 MatLab 的替代方案,现在被视为一种更加现代和完整的编程语言。

NumPy 是开源的,这是它的一个额外的优势。

NumPy - 环境

在线尝试

我们已经在线设置了 NumPy 编程环境,以便在线编译和执行所有可用的示例。它向你提供了信心,并使您能够使用不同的选项验证程序, 随意修改任何示例并在线执行。

使用我们的在线编译器尝试一下示例,它位于 CodingGround

​https://www.tutorialspoint.com/codingground.htm​

import numpy as np   a =  'hello world'   print a

对于本教程中给出的大多数示例,你会在我们的网站代码部分的右上角找到一个​​Try it​​选项,这会把你带到在线编译器。所以快来使用它,享受你的学习吧。

标准的 Python 发行版不会与 NumPy 模块捆绑在一起。一个轻量级的替代方法是使用流行的 Python 包安装程序 pip 来安装 NumPy。

pip install numpy

启用 NumPy 的最佳方法是使用特定于您的操作系统的可安装的二进制包。这些二进制包含完整的 SciPy 技术栈(包括 NumPy,SciPy,matplotlib,IPython,SymPy 以及 Python 核心自带的其它包)。

NumPy - Ndarray 对象

NumPy 中定义的最重要的对象是称为 ​​ndarray​​ 的 N 维数组类型。它描述相同类型的元素集合。可以使用基于零的索引访问集合中的项目。

​ndarray​​​中的每个元素在内存中使用相同大小的块。 ​​ndarray​​​中的每个元素是数据类型对象的对象(称为 ​​dtype​​)。

从​​ndarray​​​对象提取的任何元素(通过切片)由一个数组标量类型的 Python 对象表示。下图显示了​​ndarray​​​,数据类型对象(​​dtype​​)和数组标量类型之间的关系。

收藏&下载 | 最全的NumPy 教程,没有之一_数据类型

​ndarray​​​类的实例可以通过本教程后面描述的不同的数组创建例程来构造。基本的​​ndarray​​是使用 NumPy 中的数组函数创建的,如下所示:

numpy.array

它从任何暴露数组接口的对象,或从返回数组的任何方法创建一个ndarray。

numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)

上面的构造器接受以下参数:

序号

参数及描述

1.

​object​​ 任何暴露数组接口方法的对象都会返回一个数组或任何(嵌套)序列。

2.

​dtype​​ 数组的所需数据类型,可选。

3.

​copy​​​ 可选,默认为​​true​​,对象是否被复制。

4.

​order​​​ ​​C​​​(按行)、​​F​​​(按列)或​​A​​(任意,默认)。

5.

​subok​​​ 默认情况下,返回的数组被强制为基类数组。如果为​​true​​,则返回子类。

6.

​ndimin​​ 指定返回数组的最小维数。

看看下面的例子来更好地理解。

示例 1

import numpy as np
a = np.array([1,2,3])
print a

输出如下:

[1, 2, 3]

示例 2

# 多于一个维度  
import numpy as np
a = np.array([[1, 2], [3, 4]])
print a

输出如下:

[[1, 2]
[3, 4]]

示例 3

# 最小维度  
import numpy as np
a = np.array([1, 2, 3,4,5], ndmin = 2)
print a

输出如下:

[[1, 2, 3, 4, 5]]

示例 4

# dtype 参数  
import numpy as np
a = np.array([1, 2, 3], dtype = complex)
print a

输出如下:

[ 1.+0.j,  2.+0.j,  3.+0.j]

**ndarray ** 对象由计算机内存中的一维连续区域组成,带有将每个元素映射到内存块中某个位置的索引方案。内存块以按行(C 风格)或按列(FORTRAN 或 MatLab 风格)的方式保存元素。

NumPy - 数据类型

NumPy 支持比 Python 更多种类的数值类型。下表显示了 NumPy 中定义的不同标量数据类型。

序号

数据类型及描述

1.

​bool_​​ 存储为一个字节的布尔值(真或假)

2.

​int_​​​ 默认整数,相当于 C 的​​long​​​,通常为​​int32​​​或​​int64​

3.

​intc​​​ 相当于 C 的​​int​​​,通常为​​int32​​​或​​int64​

4.

​intp​​​ 用于索引的整数,相当于 C 的​​size_t​​​,通常为​​int32​​​或​​int64​

5.

​int8​​ 字节(-128 ~ 127)

6.

​int16​​ 16 位整数(-32768 ~ 32767)

7.

​int32​​ 32 位整数(-2147483648 ~ 2147483647)

8.

​int64​​ 64 位整数(-9223372036854775808 ~ 9223372036854775807)

9.

​uint8​​ 8 位无符号整数(0 ~ 255)

10.

​uint16​​ 16 位无符号整数(0 ~ 65535)

11.

​uint32​​ 32 位无符号整数(0 ~ 4294967295)

12.

​uint64​​ 64 位无符号整数(0 ~ 18446744073709551615)

13.

​float_​​​ ​​float64​​的简写

14.

​float16​​ 半精度浮点:符号位,5 位指数,10 位尾数

15.

​float32​​ 单精度浮点:符号位,8 位指数,23 位尾数

16.

​float64​​ 双精度浮点:符号位,11 位指数,52 位尾数

17.

​complex_​​​ ​​complex128​​的简写

18.

​complex64​​ 复数,由两个 32 位浮点表示(实部和虚部)

19.

​complex128​​ 复数,由两个 64 位浮点表示(实部和虚部)

NumPy 数字类型是​​dtype​​​(数据类型)对象的实例,每个对象具有唯一的特征。这些类型可以是​​np.bool_​​​,​​np.float32​​等。

数据类型对象 (dtype)

数据类型对象描述了对应于数组的固定内存块的解释,取决于以下方面:

  • 数据类型(整数、浮点或者 Python 对象)
  • 数据大小
  • 字节序(小端或大端)
  • 在结构化类型的情况下,字段的名称,每个字段的数据类型,和每个字段占用的内存块部分。
  • 如果数据类型是子序列,它的形状和数据类型。

字节顺序取决于数据类型的前缀​​<​​​或​​>​​​。 ​​<​​​意味着编码是小端(最小有效字节存储在最小地址中)。 ​​>​​意味着编码是大端(最大有效字节存储在最小地址中)。

​dtype​​可由一下语法构造:

numpy.dtype(object, align, copy)

参数为:

  • ​Object​​:被转换为数据类型的对象。
  • ​Align​​​:如果为​​true​​,则向字段添加间隔,使其类似 C 的结构体。
  • ​Copy​​​:生成​​dtype​​对象的新副本,如果为​​flase​​,结果是内建数据类型对象的引用。

示例 1

# 使用数组标量类型  
import numpy as np
dt = np.dtype(np.int32)
print dt

输出如下:

int32

示例 2

#int8,int16,int32,int64 可替换为等价的字符串 'i1','i2','i4',以及其他。 
import numpy as np

dt = np.dtype('i4')
print dt

输出如下:

int32

示例 3

# 使用端记号  
import numpy as np
dt = np.dtype('>i4')
print dt

输出如下:

>i4

下面的例子展示了结构化数据类型的使用。这里声明了字段名称和相应的标量数据类型。

示例 4

# 首先创建结构化数据类型。 
import numpy as np
dt = np.dtype([('age',np.int8)])
print dt

输出如下:

[('age', 'i1')]

示例 5

# 现在将其应用于 ndarray 对象  
import numpy as np

dt = np.dtype([('age',np.int8)])
a = np.array([(10,),(20,),(30,)], dtype = dt)
print a

输出如下:

[(10,) (20,) (30,)]

示例 6

# 文件名称可用于访问 age 列的内容  
import numpy as np

dt = np.dtype([('age',np.int8)])
a = np.array([(10,),(20,),(30,)], dtype = dt)
print a['age']

输出如下:

[10 20 30]

示例 7

以下示例定义名为 student 的结构化数据类型,其中包含字符串字段​​name​​​,整数字段​​age​​​和浮点字段​​marks​​​。此​​dtype​​​应用于​​ndarray​​对象。

import numpy as np
student = np.dtype([('name','S20'), ('age', 'i1'), ('marks', 'f4')])
print student

输出如下:

[('name', 'S20'), ('age', 'i1'), ('marks', '<f4')]

示例 8

import numpy as np

student = np.dtype([('name','S20'), ('age', 'i1'), ('marks', 'f4')])
a = np.array([('abc', 21, 50),('xyz', 18, 75)], dtype = student)
print a

输出如下:

[('abc', 21, 50.0), ('xyz', 18, 75.0)]

每个内建类型都有一个唯一定义它的字符代码:

  • ​'b'​​:布尔值
  • ​'i'​​:符号整数
  • ​'u'​​:无符号整数
  • ​'f'​​:浮点
  • ​'c'​​:复数浮点
  • ​'m'​​:时间间隔
  • ​'M'​​:日期时间
  • ​'O'​​:Python 对象
  • ​'S', 'a'​​:字节串
  • ​'U'​​:Unicode
  • ​'V'​​​:原始数据(​​void​​)

NumPy - 数组属性

这一章中,我们会讨论 NumPy 的多种数组属性。

ndarray.shape

这一数组属性返回一个包含数组维度的元组,它也可以用于调整数组大小。

示例 1

import numpy as np
a = np.array([[1,2,3],[4,5,6]])
print a.shape

输出如下:

(2, 3)

示例 2

NumPy 也提供了​​reshape​​函数来调整数组大小。

import numpy as np
a = np.array([[1,2,3],[4,5,6]])
b = a.reshape(3,2)
print b

输出如下:

[[1, 2]
[3, 4]
[5, 6]]

NumPy - 切片和索引

​ndarray​​对象的内容可以通过索引或切片来访问和修改,就像 Python 的内置容器对象一样。

如前所述,​​ndarray​​对象中的元素遵循基于零的索引。有三种可用的索引方法类型:字段访问,基本切片高级索引

基本切片是 Python 中基本切片概念到 n 维的扩展。通过将​​start​​​,​​stop​​​和​​step​​​参数提供给内置的​​slice​​​函数来构造一个 Python ​​slice​​​对象。此​​slice​​对象被传递给数组来提取数组的一部分。

示例 1

import numpy as np
a = np.arange(10)
s = slice(2,7,2)
print a[s]

输出如下:

[2  4  6]

在上面的例子中,​​ndarray​​​对象由​​arange()​​​函数创建。然后,分别用起始,终止和步长值​​2​​​,​​7​​​和​​2​​​定义切片对象。当这个切片对象传递给​​ndarray​​​时,会对它的一部分进行切片,从索引​​2​​​到​​7​​​,步长为​​2​​。

通过将由冒号分隔的切片参数(​​start:stop:step​​​)直接提供给​​ndarray​​对象,也可以获得相同的结果。

示例 2

import numpy as np
a = np.arange(10)
b = a[2:7:2]
print b

输出如下:

[2  4  6]

如果只输入一个参数,则将返回与索引对应的单个项目。如果使用a:,则从该索引向后的所有项目将被提取。如果使用两个参数(以:分隔),则对两个索引(不包括停止索引)之间的元素以默认步骤进行切片。

NumPy - 高级索引

如果一个​​ndarray​​​是非元组序列,数据类型为整数或布尔值的​​ndarray​​​,或者至少一个元素为序列对象的元组,我们就能够用它来索引​​ndarray​​。高级索引始终返回数据的副本。与此相反,切片只提供了一个视图。

有两种类型的高级索引:整数和布尔值。

整数索引

这种机制有助于基于 N 维索引来获取数组中任意元素。每个整数数组表示该维度的下标值。当索引的元素个数就是目标​​ndarray​​的维度时,会变得相当直接。

以下示例获取了​​ndarray​​对象中每一行指定列的一个元素。因此,行索引包含所有行号,列索引指定要选择的元素。

示例

import numpy as np
x = np.array([[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]])
print '我们的数组是:'
print x
print '\n'
# 切片
z = x[1:4,1:3]
print '切片之后,我们的数组变为:'
print z
print '\n'
# 对列使用高级索引
y = x[1:4,[1,2]]
print '对列使用高级索引来切片:'
print y

输出如下:

我们的数组是:
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
切片之后,我们的数组变为:
[[ 4 5]
[ 7 8]
[10 11]]
对列使用高级索引来切片:
[[ 4 5]
[ 7 8]
[10 11]]

布尔索引

当结果对象是布尔运算(例如比较运算符)的结果时,将使用此类型的高级索引。

示例

这个例子中,大于 5 的元素会作为布尔索引的结果返回。

import numpy as np
x = np.array([[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]])
print '我们的数组是:'
print x
print '\n'
# 现在我们会打印出大于 5 的元素
print '大于 5 的元素是:'
print x[x > 5]

输出如下:

我们的数组是:
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
大于 5 的元素是:
[ 6 7 8 9 10 11]

NumPy - 广播

术语广播是指 NumPy 在算术运算期间处理不同形状的数组的能力。对数组的算术运算通常在相应的元素上进行。如果两个阵列具有完全相同的形状,则这些操作被无缝执行。

示例

import numpy as np

a = np.array([1,2,3,4])
b = np.array([10,20,30,40])
c = a * b
print c

输出如下:

[10   40   90   160]

如果两个数组的维数不相同,则元素到元素的操作是不可能的。然而,在 NumPy 中仍然可以对形状不相似的数组进行操作,因为它拥有广播功能。较小的数组会广播到较大数组的大小,以便使它们的形状可兼容。

如果满足以下规则,可以进行广播:

  • ​ndim​​较小的数组会在前面追加一个长度为 1 的维度。
  • 输出数组的每个维度的大小是输入数组该维度大小的最大值。
  • 如果输入在每个维度中的大小与输出大小匹配,或其值正好为 1,则在计算中可它。
  • 如果输入的某个维度大小为 1,则该维度中的第一个数据元素将用于该维度的所有计算。

如果上述规则产生有效结果,并且满足以下条件之一,那么数组被称为可广播的

  • 数组拥有相同形状。
  • 数组拥有相同的维数,每个维度拥有相同长度,或者长度为 1。
  • 数组拥有极少的维度,可以在其前面追加长度为 1 的维度,使上述条件成立。

NumPy - 数组上的迭代

NumPy 包包含一个迭代器对象​​numpy.nditer​​​。它是一个有效的多维迭代器对象,可以用于在数组上进行迭代。数组的每个元素可使用 Python 的标准​​Iterator​​接口来访问。

让我们使用​​arange()​​​函数创建一个 3X4 数组,并使用​​nditer​​对它进行迭代。

示例

import numpy as np
a = np.arange(0,60,5)
a = a.reshape(3,4)
print '原始数组是:'
print a print '\n'
print '修改后的数组是:'
for x in np.nditer(a):
print x,

输出如下:

原始数组是:
[[ 0 5 10 15]
[20 25 30 35]
[40 45 50 55]]
修改后的数组是:
0 5 10 15 20 25 30 35 40 45 50 55

NumPy - 数组操作

NumPy包中有几个例程用于处理​​ndarray​​对象中的元素。它们可以分为以下类型:

修改形状

序号

形状及描述

1.

​reshape​​ 不改变数据的条件下修改形状

2.

​flat​​ 数组上的一维迭代器

3.

​flatten​​ 返回折叠为一维的数组副本

4.

​ravel​​ 返回连续的展开数组

numpy.reshape

这个函数在不改变数据的条件下修改形状,它接受如下参数:

numpy.reshape(arr, newshape, order)

其中:

  • ​arr​​:要修改形状的数组
  • ​newshape​​:整数或者整数数组,新的形状应当兼容原有形状
  • ​order​​​:​​'C'​​为 C 风格顺序,​​'F'​​为 F 风格顺序,​​'A'​​为保留原顺序。

例子

import numpy as np
a = np.arange(8)
print '原始数组:'
print a
print '\n'
b = a.reshape(4,2)
print '修改后的数组:'
print b

输出如下:

原始数组:
[0 1 2 3 4 5 6 7]

修改后的数组:
[[0 1]
[2 3]
[4 5]
[6 7]]

numpy.ndarray.flat

该函数返回数组上的一维迭代器,行为类似 Python 内建的迭代器。

例子

import numpy as np
a = np.arange(8).reshape(2,4)
print '原始数组:'
print a
print '\n'
print '调用 flat 函数之后:'
# 返回展开数组中的下标的对应元素
print a.flat[5]

输出如下:

原始数组:
[[0 1 2 3]
[4 5 6 7]]
调用 flat 函数之后:
5

numpy.ndarray.flatten

该函数返回折叠为一维的数组副本,函数接受下列参数:

ndarray.flatten(order)

其中:

  • ​order​​​:​​'C'​​ -- 按行,​​'F'​​ -- 按列,​​'A'​​ -- 原顺序,​​'k'​​ -- 元素在内存中的出现顺序。

例子

import numpy as np
a = np.arange(8).reshape(2,4)

print '原数组:'
print a
print '\n'
# default is column-major
print '展开的数组:'
print a.flatten()
print '\n'
print '以 F 风格顺序展开的数组:'
print a.flatten(order = 'F')

输出如下:

原数组:
[[0 1 2 3]
[4 5 6 7]]
展开的数组:
[0 1 2 3 4 5 6 7]
以 F 风格顺序展开的数组:
[0 4 1 5 2 6 3 7]

numpy.ravel

这个函数返回展开的一维数组,并且按需生成副本。返回的数组和输入数组拥有相同数据类型。这个函数接受两个参数。

numpy.ravel(a, order)

构造器接受下列参数:

  • ​order​​​:​​'C'​​ -- 按行,​​'F'​​ -- 按列,​​'A'​​ -- 原顺序,​​'k'​​ -- 元素在内存中的出现顺序。

例子

import numpy as np
a = np.arange(8).reshape(2,4)

print '原数组:'
print a
print '\n'
print '调用 ravel 函数之后:'
print a.ravel()
print '\n'
print '以 F 风格顺序调用 ravel 函数之后:'
print a.ravel(order = 'F')

输出如下:

原数组:
[[0 1 2 3]
[4 5 6 7]]

调用 ravel 函数之后:
[0 1 2 3 4 5 6 7]

以 F 风格顺序调用 ravel 函数之后:
[0 4 1 5 2 6 3 7]

翻转操作

序号

操作及描述

1.

​transpose​​ 翻转数组的维度

2.

​ndarray.T​​​ 和​​self.transpose()​​相同

3.

​rollaxis​​ 向后滚动指定的轴

4.

​swapaxes​​ 互换数组的两个轴

修改维度

序号

维度和描述

1.

​broadcast​​ 产生模仿广播的对象

2.

​broadcast_to​​ 将数组广播到新形状

3.

​expand_dims​​ 扩展数组的形状

4.

​squeeze​​ 从数组的形状中删除单维条目

数组的连接

序号

数组及描述

1.

​concatenate​​ 沿着现存的轴连接数据序列

2.

​stack​​ 沿着新轴连接数组序列

3.

​hstack​​ 水平堆叠序列中的数组(列方向)

4.

​vstack​​ 竖直堆叠序列中的数组(行方向)

数组分割

序号

数组及操作

1.

​split​​ 将一个数组分割为多个子数组

2.

​hsplit​​ 将一个数组水平分割为多个子数组(按列)

3.

​vsplit​​ 将一个数组竖直分割为多个子数组(按行)

添加/删除元素

序号

元素及描述

1.

​resize​​ 返回指定形状的新数组

2.

​append​​ 将值添加到数组末尾

3.

​insert​​ 沿指定轴将值插入到指定下标之前

4.

​delete​​ 返回删掉某个轴的子数组的新数组

5.

​unique​​ 寻找数组内的唯一元素

NumPy - 位操作

下面是 NumPy 包中可用的位操作函数。

序号

操作及描述

1.

​bitwise_and​​ 对数组元素执行位与操作

2.

​bitwise_or​​ 对数组元素执行位或操作

3.

​invert​​ 计算位非

4.

​left_shift​​ 向左移动二进制表示的位

5.

​right_shift​​ 向右移动二进制表示的位

示例

import numpy as np
print '13 和 17 的二进制形式:'
a,b = 13,17
print bin(a), bin(b)
print '\n'
print '13 和 17 的位与:'
print np.bitwise_and(13, 17)

输出如下:

13 和 17 的二进制形式:
0b1101 0b10001

13 和 17 的位与:
1

你可以使用下表验证此输出。考虑下面的位与真值表。

A

B

AND

1

1

1

1

0

0

0

1

0

0

0

0

|  |  | 1 | 1 | 0 | 1 |
| --- | --- |
| AND |
| | 1 | 0 | 0 | 0 | 1 |
| result | 0 | 0 | 0 | 0 | 1 |

NumPy - 字符串函数

以下函数用于对​​dtype​​​为​​numpy.string_​​​或​​numpy.unicode_​​的数组执行向量化字符串操作。它们基于 Python 内置库中的标准字符串函数。

序号

函数及描述

1.

​add()​​​ 返回两个​​str​​​或​​Unicode​​数组的逐个字符串连接

2.

​multiply()​​ 返回按元素多重连接后的字符串

3.

​center()​​ 返回给定字符串的副本,其中元素位于特定字符串的中央

4.

​capitalize()​​ 返回给定字符串的副本,其中只有第一个字符串大写

5.

​title()​​ 返回字符串或 Unicode 的按元素标题转换版本

6.

​lower()​​ 返回一个数组,其元素转换为小写

7.

​upper()​​ 返回一个数组,其元素转换为大写

8.

​split()​​ 返回字符串中的单词列表,并使用分隔符来分割

9.

​splitlines()​​ 返回元素中的行列表,以换行符分割

10.

​strip()​​ 返回数组副本,其中元素移除了开头或者结尾处的特定字符

11.

​join()​​ 返回一个字符串,它是序列中字符串的连接

12.

​replace()​​ 返回字符串的副本,其中所有子字符串的出现位置都被新字符串取代

13.

​decode()​​​ 按元素调用​​str.decode​

14.

​encode()​​​ 按元素调用​​str.encode​

这些函数在字符数组类(​​numpy.char​​​)中定义。较旧的 Numarray 包包含​​chararray​​​类。​​numpy.char​​类中的上述函数在执行向量化字符串操作时非常有用。

示例

import numpy as np
print '连接两个字符串:'
print np.char.add(['hello'],[' xyz'])
print '\n'
print '连接示例:'
print np.char.add(['hello', 'hi'],[' abc', ' xyz'])

输出如下:

连接两个字符串:
['hello xyz']

连接示例:
['hello abc' 'hi xyz']

NumPy - 算数函数

很容易理解的是,NumPy 包含大量的各种数学运算功能。NumPy 提供标准的三角函数,算术运算的函数,复数处理函数等。

三角函数

NumPy 拥有标准的三角函数,它为弧度制单位的给定角度返回三角函数比值。

舍入函数

numpy.around()

这个函数返回四舍五入到所需精度的值。该函数接受以下参数。

numpy.around(a,decimals)

其中:

序号

参数及描述

1.

​a​​ 输入数组

2.

​decimals​​ 要舍入的小数位数。默认值为0。如果为负,整数将四舍五入到小数点左侧的位置

NumPy - 算数运算

用于执行算术运算(如​​add()​​​,​​subtract()​​​,​​multiply()​​​和​​divide()​​)的输入数组必须具有相同的形状或符合数组广播规则。

示例 

import numpy as np
a = np.arange(9, dtype = np.float_).reshape(3,3)
print '第一个数组:'
print a
print '\n'
print '第二个数组:'
b = np.array([10,10,10])
print b
print '\n'
print '两个数组相加:'
print np.add(a,b)
print '\n'
print '两个数组相减:'
print np.subtract(a,b)
print '\n'
print '两个数组相乘:'
print np.multiply(a,b)
print '\n'
print '两个数组相除:'
print np.divide(a,b)

输出如下:

第一个数组:
[[ 0. 1. 2.]
[ 3. 4. 5.]
[ 6. 7. 8.]]

第二个数组:
[10 10 10]

两个数组相加:
[[ 10. 11. 12.]
[ 13. 14. 15.]
[ 16. 17. 18.]]

两个数组相减:
[[-10. -9. -8.]
[ -7. -6. -5.]
[ -4. -3. -2.]]

两个数组相乘:
[[ 0. 10. 20.]
[ 30. 40. 50.]
[ 60. 70. 80.]]

两个数组相除:
[[ 0. 0.1 0.2]
[ 0.3 0.4 0.5]
[ 0.6 0.7 0.8]]

NumPy - 统计函数

NumPy 有很多有用的统计函数,用于从数组中给定的元素中查找最小,最大,百分标准差和方差等。函数说明如下:

numpy.amin() 和 numpy.amax()

这些函数从给定数组中的元素沿指定轴返回最小值和最大值。

numpy.ptp()

​numpy.ptp()​​函数返回沿轴的值的范围(最大值 - 最小值)。

numpy.percentile()

百分位数是统计中使用的度量,表示小于这个值得观察值占某个百分比。函数​​numpy.percentile()​​接受以下参数。

numpy.percentile(a, q, axis)

其中:

序号

参数及描述

1.

​a​​ 输入数组

2.

​q​​ 要计算的百分位数,在 0 ~ 100 之间

3.

​axis​​ 沿着它计算百分位数的轴

numpy.median()

中值定义为将数据样本的上半部分与下半部分分开的值。 ​​numpy.median()​​函数的用法如下面的程序所示。

numpy.mean()

算术平均值是沿轴的元素的总和除以元素的数量。 ​​numpy.mean()​​函数返回数组中元素的算术平均值。如果提供了轴,则沿其计算。

numpy.average()

加权平均值是由每个分量乘以反映其重要性的因子得到的平均值。 ​​numpy.average()​​函数根据在另一个数组中给出的各自的权重计算数组中元素的加权平均值。该函数可以接受一个轴参数。如果没有指定轴,则数组会被展开。

考虑数组​​[1,2,3,4]​​​和相应的权重​​[4,3,2,1]​​,通过将相应元素的乘积相加,并将和除以权重的和,来计算加权平均值。

加权平均值 = (1*4+2*3+3*2+4*1)/(4+3+2+1)

标准差

标准差是与均值的偏差的平方的平均值的平方根。标准差公式如下:

std = sqrt(mean((x - x.mean())**2))

如果数组是​​[1,2,3,4]​​​,则其平均值为​​2.5​​​。因此,差的平方是​​[2.25,0.25,0.25,2.25]​​​,并且其平均值的平方根除以4,即​​sqrt(5/4)​​​是​​1.1180339887498949​​。

方差

方差是偏差的平方的平均值,即​​mean((x - x.mean())** 2)​​。换句话说,标准差是方差的平方根。

NumPy - 排序、搜索和计数函数

NumPy中提供了各种排序相关功能。这些排序函数实现不同的排序算法,每个排序算法的特征在于执行速度,最坏情况性能,所需的工作空间和算法的稳定性。下表显示了三种排序算法的比较。

种类

速度

最坏情况

工作空间

稳定性

​'quicksort'​​(快速排序)

1

​O(n^2)​

0


​'mergesort'​​(归并排序)

2

​O(n*log(n))​

~n/2


​'heapsort'​​(堆排序)

3

​O(n*log(n))​

0


示例 

import numpy as np  
a = np.array([[3,7],[9,1]])
print '我们的数组是:'
print a
print '\n'
print '调用 sort() 函数:'
print np.sort(a)
print '\n'
print '沿轴 0 排序:'
print np.sort(a, axis = 0)
print '\n'
# 在 sort 函数中排序字段
dt = np.dtype([('name', 'S10'),('age', int)])
a = np.array([("raju",21),("anil",25),("ravi", 17), ("amar",27)], dtype = dt)
print '我们的数组是:'
print a
print '\n'
print '按 name 排序:'
print np.sort(a, order = 'name')

输出如下:

我们的数组是:
[[3 7]
[9 1]]
调用 sort() 函数:
[[3 7]
[1 9]]
沿轴 0 排序:
[[3 1]
[9 7]]
我们的数组是:
[('raju', 21) ('anil', 25) ('ravi', 17) ('amar', 27)]
按 name 排序:
[('amar', 27) ('anil', 25) ('raju', 21) ('ravi', 17)]

NumPy - 线性代数

NumPy 包包含​​numpy.linalg​​模块,提供线性代数所需的所有功能。此模块中的一些重要功能如下表所述。

序号

函数及描述

1.

​dot​​ 两个数组的点积

2.

​vdot​​ 两个向量的点积

3.

​inner​​ 两个数组的内积

4.

​matmul​​ 两个数组的矩阵积

5.

​determinant​​ 数组的行列式

6.

​solve​​ 求解线性矩阵方程

7.

​inv​​ 寻找矩阵的乘法逆矩阵

示例 

import numpy.matlib
import numpy as np

a = np.array([[1,2],[3,4]])
b = np.array([[11,12],[13,14]])
np.dot(a,b)

输出如下:

[[37  40]
[85 92]]

NumPy - Matplotlib

Matplotlib 是 Python 的绘图库。它可与 NumPy 一起使用,提供了一种有效的 MatLab 开源替代方案。它也可以和图形工具包一起使用,如 PyQt 和 wxPython。

Matplotlib 模块最初是由 John D. Hunter 编写的。自 2012 年以来,Michael Droettboom 是主要开发者。目前,Matplotlib 1.5.1 是可用的稳定版本。该软件包可以二进制分发,其源代码形式在 www.matplotlib.org 上提供。

通常,通过添加以下语句将包导入到 Python 脚本中:

from matplotlib import pyplot as plt

这里​​pyplot()​​​是 matplotlib 库中最重要的函数,用于绘制 2D 数据。以下脚本绘制方程​​y = 2x + 5​​:

示例 

import numpy as np
from matplotlib import pyplot as plt

x = np.arange(1,11)
y = 2 * x + 5
plt.title("Matplotlib demo")
plt.xlabel("x axis caption")
plt.ylabel("y axis caption")
plt.plot(x,y)
plt.show()

​ndarray​​​对象​​x​​​由​​np.arange()​​​函数创建为​​x​​​轴上的值。​​y​​​轴上的对应值存储在另一个数组对象​​y​​​中。这些值使用​​matplotlib​​​软件包的​​pyplot​​​子模块的​​plot()​​函数绘制。

图形由​​show()​​函数展示。

上面的代码应该产生以下输出:

收藏&下载 | 最全的NumPy 教程,没有之一_数据类型_02

作为线性图的替代,可以通过向​​plot()​​函数添加格式字符串来显示离散值。可以使用以下格式化字符。

字符

描述


​'-'​

实线样式


​'--'​

短横线样式


​'-.'​

点划线样式


​':'​

虚线样式


​'.'​

点标记


​','​

像素标记


​'o'​

圆标记


​'v'​

倒三角标记


​'^'​

正三角标记


​'<'​

左三角标记


​'>'​

右三角标记


​'1'​

下箭头标记


​'2'​

上箭头标记


​'3'​

左箭头标记


​'4'​

右箭头标记


​'s'​

正方形标记


​'p'​

五边形标记


​'*'​

星形标记


​'h'​

六边形标记 1


​'H'​

六边形标记 2


​'+'​

加号标记


​'x'​

X 标记


​'D'​

菱形标记


​'d'​

窄菱形标记


`'

'`

竖直线标记

​'_'​

水平线标记


还定义了以下颜色缩写。

字符

颜色

​'b'​

蓝色

​'g'​

绿色

​'r'​

红色

​'c'​

青色

​'m'​

品红色

​'y'​

黄色

​'k'​

黑色

​'w'​

白色

要显示圆来代表点,而不是上面示例中的线,请使用​​ob​​​作为​​plot()​​函数中的格式字符串。

示例 

import numpy as np
from matplotlib import pyplot as plt

x = np.arange(1,11)
y = 2 * x + 5
plt.title("Matplotlib demo")
plt.xlabel("x axis caption")
plt.ylabel("y axis caption")
plt.plot(x,y,"ob")
plt.show()

上面的代码应该产生以下输出:

收藏&下载 | 最全的NumPy 教程,没有之一_数组_03

绘制正弦波

以下脚本使用 matplotlib 生成正弦波图。

示例 

import numpy as np
import matplotlib.pyplot as plt
# 计算正弦曲线上点的 x 和 y 坐标
x = np.arange(0, 3 * np.pi, 0.1)
y = np.sin(x)
plt.title("sine wave form")
# 使用 matplotlib 来绘制点
plt.plot(x, y)
plt.show()

收藏&下载 | 最全的NumPy 教程,没有之一_数组_04

subplot()

​subplot()​​函数允许你在同一图中绘制不同的东西。在下面的脚本中,绘制正弦和余弦值。

示例 

import numpy as np
import matplotlib.pyplot as plt
# 计算正弦和余弦曲线上的点的 x 和 y 坐标
x = np.arange(0, 3 * np.pi, 0.1)
y_sin = np.sin(x)
y_cos = np.cos(x)
# 建立 subplot 网格,高为 2,宽为 1
# 激活第一个 subplot
plt.subplot(2, 1, 1)
# 绘制第一个图像
plt.plot(x, y_sin)
plt.title('Sine')
# 将第二个 subplot 激活,并绘制第二个图像
plt.subplot(2, 1, 2)
plt.plot(x, y_cos)
plt.title('Cosine')
# 展示图像
plt.show()

上面的代码应该产生以下输出:

收藏&下载 | 最全的NumPy 教程,没有之一_数组_05

bar()

​pyplot​​​子模块提供​​bar()​​​函数来生成条形图。以下示例生成两组​​x​​​和​​y​​数组的条形图。

示例 

from matplotlib import pyplot as plt
x = [5,8,10]
y = [12,16,6]
x2 = [6,9,11]
y2 = [6,15,7]
plt.bar(x, y, align = 'center')
plt.bar(x2, y2, color = 'g', align = 'center')
plt.title('Bar graph')
plt.ylabel('Y axis')
plt.xlabel('X axis')
plt.show()

NumPy - 使用 Matplotlib 绘制直方图

NumPy 有一个​​numpy.histogram()​​​函数,它是数据的频率分布的图形表示。水平尺寸相等的矩形对应于类间隔,称为​​bin​​​,变量​​height​​对应于频率。

​numpy.histogram()​

​numpy.histogram()​​​函数将输入数组和​​bin​​​作为两个参数。 ​​bin​​​数组中的连续元素用作每个​​bin​​的边界。

import numpy as np

a = np.array([22,87,5,43,56,73,55,54,11,20,51,5,79,31,27]) ]
np.histogram(a,bins = [0,20,40,60,80,100])
hist,bins = np.histogram(a,bins = [0,20,40,60,80,100])
print hist
print bins

输出如下:

[3 4 5 2 1]
[0 20 40 60 80 100]

​plt()​

Matplotlib 可以将直方图的数字表示转换为图形。 ​​pyplot​​​子模块的​​plt()​​​函数将包含数据和​​bin​​数组的数组作为参数,并转换为直方图。

from matplotlib import pyplot as plt
import numpy as np

a = np.array([22,87,5,43,56,73,55,54,11,20,51,5,79,31,27])
plt.hist(a, bins = [0,20,40,60,80,100])
plt.title("histogram")
plt.show()

输出如下:

收藏&下载 | 最全的NumPy 教程,没有之一_数组_06

标签:教程,示例,NumPy,最全,np,数组,print,numpy
From: https://blog.51cto.com/u_9205406/5983628

相关文章

  • CentOS7 搭建k8s环境教程
    一.为什么是k8sv1.16.0?最新版的v1.16.2试过了,一直无法安装完成,安装到kubeadminit那一步执行后,报了很多错,如:nodexxxnotfound等。centos7都重装了几次,还是无法解决。用......
  • spring boot——spring boot的基本配置——spring boot整合mybatis——教程
                  第二步——修改pom.xml文件:    pom文件:<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://mave......
  • 史上最全的 pom.xml 文件详解(扩展:Maven的三种项目打包方式——pom,jar,war的区别)
    史上最全的pom.xml文件详解https://blog.csdn.net/jk418756/article/details/87917776?spm=1001.2101.3001.6650.12&utm_medium=distribute.pc_relevant.none-task-blog......
  • vim指令教程
    vim指令教程0.写在前面本人最近刚刚完成了学校的软件课设,基本算得上除了毕设最后一个课设了。题目不难,就是创建linux虚拟机,并完成相应的系统编译,编译一个内核模块以及一......
  • Django视频教程 - 基于Python的Web框架(全13集)
    Django是由Python驱动的开源模型-视图-控制器(MVC)风格的Web应用程序框架,使用Django可以在即可分钟内快速开发一个高品质易维护数据库驱动的应用程序。下面是一大坨关于Django......
  • 通道其实不难!Photoshop通道教程
    ■编者按美国人称:"通道是核心,蒙板是灵魂",足以说明通道在Photoshop中的重要地位。只有弄明白通道,你才能离开初学者的行列,向高手的境界前进......
  • 51单片机教程(从原理开始基于汇编)
    【发现了关于单片机的一系列不错的文章】很多电子爱好者,都想学习单片机这门技术。下面的这一系列教程是www.51hei.com专门为初学者入门而准备的,从底层硬件入手基于汇编和c......
  • 【保姆级】包体积优化教程
    市面上有很多优化方案,但是都没有一个完整的链路体系,现在它来了,本文将带你进阶新高度,不管是面试、绩效KPI,还是汇报宣讲,都能让你游刃有余!前置必读:​​Android包体积优化(常规、......
  • NumPy 图解入门
    最近真是很忙,python的学习都搁置了好久了,​​NumPy​​​和​​Pandas​​一直都在入门过程中。总不能一直这样,赶紧抽时间往前推进,也记录一下笔记。整理学习内容是巩固和......
  • Grafana使用教程
    Grafana是一个开源的度量分析与可视化套件。经常被用作基础设施的时间序列数据和应用程序分析的可视化,它在其他领域也被广泛的使用包括工业传感器、家庭自动化、天气和过程......