基础
numpy是python中最常用的科学计算包,而数组则是是numpy的核心类型,也是Python称为科学计算领域首选语言的关键类型,可以不夸张地说,正是数组类型的强大与易用性,筑就了Python帝国。
在Python中,数组最简单的创建方式是调用array函数,可将元组或列表转换为数组
import numpy as np
x = np.array([1,2,3])
type(x) #
- 1
- 2
- 3
与python自带的range类似,numpy提供了arange函数,可快速生成一个序列
x = np.arange(5)
print(x) # 0 1 2 3 4
- 1
- 2
除了arange之外,numpy中另一个出现频率很高的数组是随机数组【rand】,例如想要创建一个 2 × 3 2\times3 2×3的随机数组,可以写作
R = np.random.rand(2,3)
- 1
和列表或者元组相比,同维度的数组之间可以直接计算,并且数组也可以和单个的数值进行计算。此外,数组内置了
z = x + 1j
print(z.real, z.imag)
- 1
- 2
real和imag是数组的内置属性,表示实部和虚部。除此之外,数组的内置属性大致可分为三类,即
- 类型信息:
dtype
- 内存信息:
itemsize
,nbytes
,stirdes
,data
,flags
- 维度特征:
ndim
,shape
,size
,转置T
,展平flat
dtype即数组中元素的数据类型,除了python自带的类型之外,numpy额外封装了多种类型,比如np.uint8表示8为无符号整型;np.float64表示64位浮点型,可以据此推测其他类型的表示方法。
内存信息类属性,主要存储了数组在内存中所占字节数以及存储状态等,在计算式较少用到。
数组的维度特征是最常遇到的数组属性,其中ndim表示数组的维度;shape表示数组的形状;size为数组的元素个数。例如,对于数组 R R R而言,其ndim为2,shape为 2 × 3 2\times3 2×3,size为6。
属性T是数组的转置,flat将把数组整形成一维,但并不会返回一个一维数组,而是得到一个一维数组的迭代游标,并用于遍历
for r in R.flat:
print(r, end=', ')
- 1
- 2
调整形状
数组中的数据在内存里是固定的,但计算时的排列方式却可以随时更改,这也是数组的强大之处。数组中内置了一些用于调整形状的方法,主要有以下三种
- 整平
flatten
,ravel
,squeeze
- 重置形状
reshape
,resize
- 调整坐标轴
transpose
,swapaxes
flatten和reval可以将数组展平成一维,相当于得到属性flat所对应的数组。squeeze相对比较温和,会摘掉删除尺寸为1的维度,例如
a = np.array([[[[1,2]]]])
print(x.shape) # (1, 1, 1, 2)
print(a.squeeze())
# 返回值为[1,2],外层的括号都被磨掉了
- 1
- 2
- 3
- 4
【reshape】和【resize】功能相同,用于重置数组的形状,区别是前者返回新数组,后者则直接修改原始数组。以reshape为例,可实现将 [ 1 , 2 , 3 , 4 , 5 , 6 ] [1,2,3,4,5,6] [1,2,3,4,5,6]整形为
y = [ 1 2 3 4 5 6 ] y = [123456] y=[142536]
代码如下。
x = np.arange(6)
y = x.reshape(2,3)
- 1
- 2
【transpose】和【swapaxes】用于调整坐标轴,如果用矩阵的视角去理解,那么大致相当于转置。以transpose为例,其输入参数为将要调整的坐标轴
x.transpose(1,0)
'''返回值如下
array([[ 0, 3],
[ 1, 4],
[ 2, 5]])
'''
- 1
- 2
- 3
- 4
- 5
- 6
二元计算
Numpy重载常用的数学运算、比较运算以及位运算的运算符,除此之外,Numpy还实现了矩阵乘法@
。
Numpy的有一个强大的功能,即broadcast,一般被翻译成广播,即允许不同维度的数组进行计算,在下面的案例中, x x x为1行3列, y y y为2行1列,二者相加后变成3行5列的矩阵。
A = np.arange(3).reshape(3,1)*10
B = np.arange(5).reshape(1,5)
x = A + B
- 1
- 2
- 3
其运算逻辑如下
[ 0 10 20 ] + [ 0 1 2 3 4 5 ] = [ 00 01 02 03 04 10 11 12 13 14 20 21 22 23 24 ] [01020]+ [012345] = [000102030410111213142021222324] 01020 +[012345]= 001020011121021222031323041424
数组索引
和Python中的其他容器一样,数组通过[]
索引,支持:
格式,索引号从0开始,负数表示从后向前索引。下表以
x
x
x为例,演示numpy的索引方法。
代码 | 索引结果 | 含义 |
---|---|---|
x[-1] |
[
20
21
22
23
24
]
[2021222324] | 倒数第一行 |
x[:,1] |
[
01
11
21
]
[011121] | 第1列 |
x[0:2, 1:3] |
[
01
02
11
12
]
[01110212] | 第0到2行;第1到3列的所有元素 |
x[:2, 1:] |
[
01
02
03
04
11
12
13
14
]
[0111021203130414] | 0:2中的0可以省略 冒号后面什么也不写表示末尾 |
x[[0,2]] |
[
00
01
02
03
04
20
21
22
23
24
]
[00200121022203230424] | 索引第0行和第2行 |
x[[0,2],[1,4]] |
[
01
24
]
[0124] | 索引 ( 0 , 1 ) , ( 2 , 4 ) (0,1), (2,4) (0,1),(2,4)这两个点 |
此外,numpy数组支持更高级的冒号写法,以x[1:8:2]
为例,表示以2为间隔索引从1到8的数据。
x = np.arange(10)
x[1:8:2]
#[1, 3, 5, 7])
- 1
- 2
- 3
评论记录:
回复评论: