NumPy学习(一)
1.NumPy简介
NumPy是Python中科学计算的基础包。它是一个Python库,提供多维数组对象,各种派生对象(如掩码数组和矩阵),以及用于数组快速操作的各种API,有包括数学、逻辑、形状操作、排序、选择、输入输出、离散傅立叶变换、基本线性代数,基本统计运算和随机模拟等等。
使用
-
使用pip安装numpy
pip install numpy
-
引用numpy库
import numpy as np
2.Ndarray对象
Ndarray即N维数组类型。
声明
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. | ndmin 指定返回数组的最小维数。 |
示例
一维数组
输入为:
import numpy as np a = np.array([1, 2, 3]) print(a)
输出:
[1, 2, 3]
多于一维
输入:
a = np.array([[1, 2], [3, 4]]) print(a)
输出:
[[1, 2] [3, 4]]
最小维度
输入:
a = np.array([1, 2, 3,4,5], ndmin = 2) print(a)
输出:
[[1, 2, 3, 4, 5]]
dtype参数
输入:
a = np.array([1, 2, 3], dtype = complex) # 数据类型为复数 print(a)
输出:
[ 1.+0.j, 2.+0.j, 3.+0.j]
3.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 位浮点表示(实部和虚部) |
数据类型对象
数据类型对象描述了对应于数组的固定内存块的解释,取决于以下方面:
- 数据类型(整数、浮点或者 Python 对象)
- 数据大小
- 字节序(小端或大端)
- 在结构化类型的情况下,字段的名称,每个字段的数据类型,和每个字段占用的内存块部分。
- 如果数据类型是子序列,它的形状和数据类型。
字节顺序取决于数据类型的前缀 <
或 >
。 <
意味着编码是小端(最小有效字节存储在最小地址中)。 >
意味着编码是大端(最大有效字节存储在最小地址中)。
dtype
可由一下语法构造:
np.dtype(object, align, copy)
参数为:
Object
:被转换为数据类型的对象。Align
: 如果为true
,则向字段添加间隔,使其类似 C 的结构体。Copy
: 生成dtype
对象的新副本,如果为flase
,结果是内建数据类型对象的引用。
4.NumPy数组属性
np.shape
这一数组属性返回一个包含数组维度的元组,它也可以用于调整数组大小。
示例 1
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
print(a.shape)
输出如下:
(2, 3)
示例 2
# 这会调整数组大小
import numpy as np
a = np.array([[1,2,3],[4,5,6]]) a.shape = (3,2)
print(a)
输出如下:
[[1, 2]
[3, 4]
[5, 6]]
示例 3
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]]
ndarray.ndim
这一数组属性返回数组的维数。
示例 1
# 等间隔数字的数组
import numpy as np
a = np.arange(10)
print(a)
输出如下:
[0 1 2 3 4 5 6 7 8 9]
示例 2
# 一维数组
import numpy as np
a = np.arange(10)
print(a.ndim)
# 现在调整其大小
b = a.reshape(2,4,3)
print(b.ndim) # b 现在拥有三个维度
输出如下:
1
3
numpy.itemsize
这一数组属性返回数组中每个元素的字节单位长度。
示例 1
# 数组的 dtype 为 int8(一个字节)
import numpy as np
x = np.array([1,2,3,4,5], dtype = np.int8)
print(x.itemsize)
输出如下:
1
示例 2
# 数组的 dtype 现在为 float32(四个字节)
import numpy as np
x = np.array([1,2,3,4,5], dtype = np.float32)
print(x.itemsize)
输出如下:
4
5.NumPy - 数组创建例程
新的ndarray
对象可以通过任何下列数组创建例程或使用低级ndarray
构造函数构造。
numpy.empty
它创建指定形状和dtype
的未初始化数组。 它使用以下构造函数:
numpy.empty(shape, dtype = float, order = 'C')
构造器接受下列参数:
序号 | 参数及描述 |
---|---|
1. | Shape 空数组的形状,整数或整数元组 |
2. | Dtype 所需的输出数组类型,可选 |
3. | Order 'C' 为按行的 C 风格数组,'F' 为按列的 Fortran 风格数组 |
示例
下面的代码展示空数组的例子:
import numpy as np
x = np.empty([3,2], dtype = int)
print(x)
输出如下:
[[22649312 1701344351]
[1818321759 1885959276]
[16779776 156368896]]
注意:数组元素为随机值,因为它们未初始化。
numpy.zeros
返回特定大小,以 0 填充的新数组。
numpy.zeros(shape, dtype = float, order = 'C')
构造器接受下列参数:
序号 | 参数及描述 |
---|---|
1. | Shape 空数组的形状,整数或整数元组 |
2. | Dtype 所需的输出数组类型,可选 |
3. | Order 'C' 为按行的 C 风格数组,'F' 为按列的 Fortran 风格数组 |
示例 1
# 含有 5 个 0 的数组,默认类型为 float
import numpy as np
x = np.zeros(5)
print(x)
输出如下:
[ 0. 0. 0. 0. 0.]
示例 2
import numpy as np
x = np.zeros((5,), dtype = np.int)
print(x)
输出如下:
[0 0 0 0 0]
示例 3
# 自定义类型
import numpy as np
x = np.zeros((2,2), dtype = [('x', 'i4'), ('y', 'i4')])
print(x)
输出如下:
[[(0,0)(0,0)]
[(0,0)(0,0)]]
numpy.ones
返回特定大小,以 1 填充的新数组。
numpy.ones(shape, dtype = None, order = 'C')
构造器接受下列参数:
序号 | 参数及描述 |
---|---|
1. | Shape 空数组的形状,整数或整数元组 |
2. | Dtype 所需的输出数组类型,可选 |
3. | Order 'C' 为按行的 C 风格数组,'F' 为按列的 Fortran 风格数组 |
示例 1
# 含有 5 个 1 的数组,默认类型为 float
import numpy as np
x = np.ones(5)
print(x)
输出如下:
[ 1. 1. 1. 1. 1.]
示例 2
import numpy as np
x = np.ones([2,2], dtype = int)
print(x)
输出如下:
[[1 1]
[1 1]]
6.NumPy - 来自现有数据的数组
这一章中,我们会讨论如何从现有数据创建数组。
numpy.asarray
此函数类似于numpy.array
,除了它有较少的参数。 这个例程对于将 Python 序列转换为ndarray
非常有用。
numpy.asarray(a, dtype = None, order = None)
构造器接受下列参数:
序号 | 参数及描述 |
---|---|
1. | a 任意形式的输入参数,比如列表、列表的元组、元组、元组的元组、元组的列表 |
2. | dtype 通常,输入数据的类型会应用到返回的ndarray |
3. | order 'C' 为按行的 C 风格数组,'F' 为按列的 Fortran 风格数组 |
下面的例子展示了如何使用asarray
函数:
示例 1
# 将列表转换为 ndarray
import numpy as np
x = [1,2,3]
a = np.asarray(x)
print(a)
输出如下:
[1 2 3]
示例 2
# 设置了 dtype
import numpy as np
x = [1,2,3]
a = np.asarray(x, dtype = float)
print(a)
输出如下:
[ 1. 2. 3.]
示例 3
# 来自元组的 ndarray
import numpy as np
x = (1,2,3)
a = np.asarray(x)
print(a)
输出如下:
[1 2 3]
示例 4
# 来自元组列表的 ndarray
import numpy as np
x = [(1,2,3),(4,5)]
a = np.asarray(x)
print(a)
输出如下:
[(1, 2, 3) (4, 5)]
numpy.frombuffer
此函数将缓冲区解释为一维数组。 暴露缓冲区接口的任何对象都用作参数来返回ndarray
。
numpy.frombuffer(buffer, dtype = float, count = -1, offset = 0)
构造器接受下列参数:
序号 | 参数及描述 |
---|---|
1. | buffer 任何暴露缓冲区借口的对象 |
2. | dtype 返回数组的数据类型,默认为float |
3. | count 需要读取的数据数量,默认为-1 ,读取所有数据 |
4. | offset 需要读取的起始位置,默认为0 |
示例
下面的例子展示了frombuffer
函数的用法。
import numpy as np
s = 'Hello World'
a = np.frombuffer(s, dtype = 'S1')
print(a)
输出如下:
['H' 'e' 'l' 'l' 'o' ' ' 'W' 'o' 'r' 'l' 'd']
numpy.fromiter
此函数从任何可迭代对象构建一个ndarray
对象,返回一个新的一维数组。
numpy.fromiter(iterable, dtype, count = -1)
构造器接受下列参数:
序号 | 参数及描述 |
---|---|
1. | iterable 任何可迭代对象 |
2. | dtype 返回数组的数据类型 |
3. | count 需要读取的数据数量,默认为-1 ,读取所有数据 |
以下示例展示了如何使用内置的range()
函数返回列表对象。 此列表的迭代器用于形成ndarray
对象。
示例 1
# 使用 range 函数创建列表对象
import numpy as np
list = range(5)
print(list)
输出如下:
[0, 1, 2, 3, 4]
示例 2
# 从列表中获得迭代器
import numpy as np
list = range(5)
it = iter(list)
# 使用迭代器创建 ndarray
x = np.fromiter(it, dtype = float)
print(x)
输出如下:
[0. 1. 2. 3. 4.]
7.NumPy - 来自数值范围的数组
这一章中,我们会学到如何从数值范围创建数组。
numpy.arange
这个函数返回ndarray
对象,包含给定范围内的等间隔值。
numpy.arange(start, stop, step, dtype)
构造器接受下列参数:
序号 | 参数及描述 |
---|---|
1. | start 范围的起始值,默认为0 |
2. | stop 范围的终止值(不包含) |
3. | step 两个值的间隔,默认为1 |
4. | dtype 返回ndarray 的数据类型,如果没有提供,则会使用输入数据的类型。 |
下面的例子展示了如何使用该函数:
示例 1
import numpy as np
x = np.arange(5)
print x
输出如下:
[0 1 2 3 4]
示例 2
import numpy as np
# 设置了 dtype
x = np.arange(5, dtype = float)
print(x)
输出如下:
[0. 1. 2. 3. 4.]
示例 3
# 设置了起始值和终止值参数
import numpy as np
x = np.arange(10,20,2)
print(x)
输出如下:
[10 12 14 16 18]
numpy.linspace
此函数类似于arange()
函数。 在此函数中,指定了范围之间的均匀间隔数量,而不是步长。 此函数的用法如下。
numpy.linspace(start, stop, num, endpoint, retstep, dtype)
构造器接受下列参数:
序号 | 参数及描述 |
---|---|
1. | start 序列的起始值 |
2. | stop 序列的终止值,如果endpoint 为true ,该值包含于序列中 |
3. | num 要生成的等间隔样例数量,默认为50 |
4. | endpoint 序列中是否包含stop 值,默认为ture |
5. | retstep 如果为true ,返回样例,以及连续数字之间的步长 |
6. | dtype 输出ndarray 的数据类型 |
下面的例子展示了linspace
函数的用法。
示例 1
import numpy as np
x = np.linspace(10,20,5)
print(x)
输出如下:
[10. 12.5 15. 17.5 20.]
示例 2
# 将 endpoint 设为 false
import numpy as np
x = np.linspace(10,20, 5, endpoint = False)
print(x)
输出如下:
[10. 12. 14. 16. 18.]
示例 3
# 输出 retstep 值
import numpy as np
x = np.linspace(1,2,5, retstep = True)
print(x)
# 这里的 retstep 为 0.25
输出如下:
(array([ 1. , 1.25, 1.5 , 1.75, 2. ]), 0.25)
numpy.logspace
此函数返回一个ndarray
对象,其中包含在对数刻度上均匀分布的数字。 刻度的开始和结束端点是某个底数的幂,通常为 10。
numpy.logscale(start, stop, num, endpoint, base, dtype)
logspace
函数的输出由以下参数决定:
序号 | 参数及描述 |
---|---|
1. | start 起始值是base ** start |
2. | stop 终止值是base ** stop |
3. | num 范围内的数值数量,默认为50 |
4. | endpoint 如果为true ,终止值包含在输出数组当中 |
5. | base 对数空间的底数,默认为10 |
6. | dtype 输出数组的数据类型,如果没有提供,则取决于其它参数 |
下面的例子展示了logspace
函数的用法。
示例 1
import numpy as np
# 默认底数是 10
a = np.logspace(1.0, 2.0, num = 10)
print(a)
输出如下:
[ 10. 12.91549665 16.68100537 21.5443469 27.82559402
35.93813664 46.41588834 59.94842503 77.42636827 100. ]
示例 2
# 将对数空间的底数设置为 2
import numpy as np
a = np.logspace(1,10,num = 10, base = 2)
print(a)
输出如下:
[ 2. 4. 8. 16. 32. 64. 128. 256. 512. 1024.]
8.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:
,则从该索引向后的所有项目将被提取。 如果使用两个参数(以:
分隔),则对两个索引(不包括停止索引)之间的元素以默认步骤进行切片。
示例 3
# 对单个元素进行切片
import numpy as np
a = np.arange(10)
b = a[5]
print(b)
输出如下:
5
示例 4
# 对始于索引的元素进行切片
import numpy as np
a = np.arange(10)
print(a[2:])
输出如下:
[2 3 4 5 6 7 8 9]
示例 5
# 对索引之间的元素进行切片
import numpy as np
a = np.arange(10)
print(a[2:5])
输出如下:
[2 3 4]
上面的描述也可用于多维ndarray
。
示例 6
import numpy as np
a = np.array([[1,2,3],[3,4,5],[4,5,6]])
print a
# 对始于索引的元素进行切片
print('现在我们从索引 a[1:] 开始对数组切片')
print(a[1:])
输出如下:
[[1 2 3]
[3 4 5]
[4 5 6]]
现在我们从索引 a[1:] 开始对数组切片
[[3 4 5]
[4 5 6]]
切片还可以包括省略号(...
),来使选择元组的长度与数组的维度相同。 如果在行位置使用省略号,它将返回包含行中元素的ndarray
。
示例 7
# 最开始的数组
import numpy as np
a = np.array([[1,2,3],[3,4,5],[4,5,6]])
print('我们的数组是:')
print(a)
print('\n')
# 这会返回第二列元素的数组:
print('第二列的元素是:')
print(a[...,1])
print('\n')
# 现在我们从第二行切片所有元素:
print('第二行的元素是:')
print(a[1,...])
print('\n')
# 现在我们从第二列向后切片所有元素:
print('第二列及其剩余元素是:')
print(a[...,1:])
输出如下:
我们的数组是:
[[1 2 3]
[3 4 5]
[4 5 6]]
第二列的元素是:
[2 4 5]
第二行的元素是:
[3 4 5]
第二列及其剩余元素是:
[[2 3]
[4 5]
[5 6]]