文章出自:https://www.hrwhisper.me/learning-notes-for-python-numpy/
python numpy的学习笔记
要使用numpy,首先需要import进来:
建议使用别名np,因为你会发现这几乎是一个大家都在用的写法!
1
|
import
numpy
as
np
|
一、创建数组
1.和list类似,可以直接用arange来表示范围:
1
2
3
|
import
numpy
as
np
a
=
np
.
arange
(
10
)
print
a
|
Output:
1
|
[
0
1
2
3
4
5
6
7
8
9
]
|
从[2,20)间隔为3的等差数列
1
2
3
|
import
numpy
as
np
a
=
np
.
arange
(
2
,
20
,
3
)
print
a
|
Output:
1
|
[
2
5
8
11
14
17
]
|
类似arange,linspace从[start , stop ] 生成num个数,Num个数间隔相等。(默认为float)
linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
1
|
print
np
.
linspace
(
0
,
2
,
9
)
|
Output:
1
|
[
0.
0.25
0.5
0.75
1.
1.25
1.5
1.75
2.
]
|
2.用list/tuple创建数组(list也可以是二维的)
1
2
3
|
import
numpy
as
np
a
=
np
.
array
(
[
range
(
5
)
]
)
print
a
|
3.快速生成x*y的全零数组
1
2
|
d
=
(
2
,
3
)
#(2,3,4)变为3维
print
np
.
zeros
(
d
)
|
Output:
1
2
|
[
[
0.
0.
0.
]
[
0.
0.
0.
]
]
|
默认生成的类型是浮点型
可以用dtype改为int
1
2
|
d
=
(
4
,
5
)
print
np
.
ones
(
d
,
dtype
=
int
)
|
还可以通过zeros_like生成相同形状的全0数组,如:
1
|
img
=
np
.
zeros_like
(
image
)
|
0~1的随机数:
1
|
np
.
random
.
rand
(
5
)
|
3.一维转化为二维数组 reshape
1
2
3
|
a
=
np
.
arange
(
10
)
a
=
a
.
reshape
(
2
,
5
)
print
a
|
Output:
1
2
|
[
[
0
1
2
3
4
]
[
5
6
7
8
9
]
]
|
PS:
这个会根据列来自动适应行!
下面这句在a=np.arange(10)等价于a = a.reshape(2, 5)
在a=np.arange(20)等价于a = a.reshape(4, 5)!
1
|
a
.
reshape
(
-
1
,
5
)
|
甚至可以转化为更高维的:
1
2
3
4
|
import
numpy
as
np
a
=
np
.
arange
(
20
)
a
=
a
.
reshape
(
2
,
2
,
5
)
print
a
|
Output:
1
2
3
4
5
|
[
[
[
0
1
2
3
4
]
[
5
6
7
8
9
]
]
[
[
10
11
12
13
14
]
[
15
16
17
18
19
]
]
]
|
当然,也可以二维转化一维的:ravel
1
2
3
|
import
numpy
as
np
a
=
np
.
array
(
[
[
1
,
2
,
3
]
,
[
4
,
5
,
6
]
]
)
print
np
.
ravel
(
a
)
|
Output:
1
|
[
1
2
3
4
5
6
]
|
4. 切割vsplit和hsplit
vsplit和hsplit用法差不多,差别在于:vsplit来进行分行,而hsplit来分列(即作用于同一行中)。
numpy.vsplit(ary, indices_or_sections)
(1)指定切分个数(需要行数能被切分的个数整除)
看下面的代码,生成了6*3的数组,用vsplit切分为3个。
1
2
3
4
|
import
numpy
as
np
a
=
np
.
arange
(
18
)
.
reshape
(
-
1
,
3
)
print
a
,
'\n'
print
np
.
vsplit
(
a
,
3
)
|
Output:
1
2
3
4
5
6
7
8
9
10
11
|
[
[
0
1
2
]
[
3
4
5
]
[
6
7
8
]
[
9
10
11
]
[
12
13
14
]
[
15
16
17
]
]
[
array
(
[
[
0
,
1
,
2
]
,
[
3
,
4
,
5
]
]
)
,
array
(
[
[
6
,
7
,
8
]
,
[
9
,
10
,
11
]
]
)
,
array
(
[
[
12
,
13
,
14
]
,
[
15
,
16
,
17
]
]
)
]
|
(2)指定位置切分
我只改动了最后一行,将vsplit第二个参数改为一个List,来指定切分的位置。
1
2
3
4
|
import
numpy
as
np
a
=
np
.
arange
(
18
)
.
reshape
(
-
1
,
3
)
print
a
,
'\n'
print
np
.
vsplit
(
a
,
[
1
,
5
]
)
|
Output:
1
2
3
4
5
6
7
8
9
10
11
|
[
[
0
1
2
]
[
3
4
5
]
[
6
7
8
]
[
9
10
11
]
[
12
13
14
]
[
15
16
17
]
]
[
array
(
[
[
0
,
1
,
2
]
]
)
,
array
(
[
[
3
,
4
,
5
]
,
[
6
,
7
,
8
]
,
[
9
,
10
,
11
]
,
[
12
,
13
,
14
]
]
)
,
array
(
[
[
15
,
16
,
17
]
]
)
]
|
5.查看数组属性
ndim :维度
shape:各维度的大小
size:全部的元素个数
dtype:查看元素类型
type:数组的类型
1
2
3
4
5
6
7
8
|
import
numpy
as
np
a
=
np
.
arange
(
20
)
a
=
a
.
reshape
(
2
,
2
,
5
)
print
a
.
ndim
#a的维度
print
a
.
shape
#a的各维度的大小
print
a
.
size
#a的全部的元素个数
print
a
.
dtype
#a的元素类型
print
type
(
a
)
#a的类型
|
Output:
1
2
3
4
5
|
3
(
2L
,
2L
,
5L
)
20
int32
<
type
'numpy.ndarray'
>
|
二、数组操作
1.四则运算
+’,’-‘,’*’,’/’运算都是基于全部的数组元素的
1
2
3
4
|
import
numpy
as
np
a
=
np
.
array
(
[
1
,
2
]
)
b
=
np
.
array
(
[
3
,
4
]
)
print
a
+
b
|
Output:
1
|
[
4
6
]
|
2.开根号/指数
1
2
3
4
5
6
7
|
import
numpy
as
np
a
=
np
.
array
(
[
1
,
2
]
)
print
np
.
sqrt
(
a
)
print
np
.
exp
(
a
)
print
np
.
square
(
a
)
print
np
.
power
(
a
,
5
)
print
a
*
*
5
#可以用Power也可以直接 ** ,当然这么写比较爽
|
Output:
1
2
3
4
5
|
[
1.
1.41421356
]
[
2.71828183
7.3890561
]
[
1
4
]
[
1
32
]
[
1
32
]
|
3.数组最大最小值
1
2
3
4
5
6
7
8
|
import
numpy
as
np
a
=
np
.
arange
(
20
)
.
reshape
(
4
,
5
)
print
a
print
a
.
min
(
)
print
a
.
max
(
)
print
a
.
sum
(
)
print
a
.
min
(
axis
=
0
)
#minimun element in each column
print
a
.
min
(
axis
=
1
)
#minimun element in each row
|
Output:
1
2
3
4
5
6
7
8
9
|
[
[
0
1
2
3
4
]
[
5
6
7
8
9
]
[
10
11
12
13
14
]
[
15
16
17
18
19
]
]
0
19
190
[
0
1
2
3
4
]
[
0
5
10
15
]
|
numpy.ptp(a, axis=None, out=None)
返回最大和最小值之差
4.数组的均值/中位数
1
2
3
4
|
import
numpy
a
=
range
(
5
)
+
[
1000
]
print
a
print
numpy
.
mean
(
a
)
,
numpy
.
median
(
a
)
|
Output:
1
2
|
[
0
,
1
,
2
,
3
,
4
,
1000
]
168.333333333
2.5
|
5.数组取值
可以直接用下标对齐取值,注意直接赋值的话是浅拷贝!(即a赋给b,意味着b指向了a对应数据的内存地址)
想要真正的复制一份a给b,可以使用copy:
1
2
3
4
5
6
7
8
|
# -*- coding:utf-8 -*-
import
numpy
as
np
a
=
np
.
array
(
[
[
1
,
2
]
,
[
3
,
4
]
]
)
b
=
a
#浅拷贝!
c
=
a
.
copy
(
)
#深拷贝 np.copy(a)
print
a
[
1
,
1
]
,
a
[
1
]
[
1
]
b
[
1
]
[
1
]
=
5
print
a
[
1
]
[
1
]
,
b
[
1
]
[
1
]
,
c
[
1
]
[
1
]
|
Output:
1
2
|
4
4
5
5
4
|
利用’:’可以访问到某一维的全部数据:
1
2
3
4
5
6
|
# -*- coding:utf-8 -*-
import
numpy
as
np
a
=
np
.
arange
(
20
)
.
reshape
(
4
,
5
)
print
a
print
'\n'
,
a
[
:
,
[
1
,
3
]
]
#取出a的每一行的第2个和第4个元素
print
'\n'
,
a
[
:
,
2
]
[
a
[
:
,
0
]
>
5
]
#取出a中的第3列的元素,如果该行第1个元素 >5
|
Output:
1
2
3
4
5
6
7
8
9
10
11
|
[
[
0
1
2
3
4
]
[
5
6
7
8
9
]
[
10
11
12
13
14
]
[
15
16
17
18
19
]
]
[
[
1
3
]
[
6
8
]
[
11
13
]
[
16
18
]
]
[
12
17
]
|
6.数组拼接
使用hstack 横向拼接
使用vstack 纵向拼接
1
2
3
4
5
6
7
8
|
import
numpy
as
np
import
numpy
.
linalg
as
nlg
a
=
np
.
array
(
[
1
,
2
,
3
]
)
b
=
np
.
array
(
[
4
,
5
,
6
]
)
c
=
np
.
hstack
(
[
a
,
b
]
)
d
=
np
.
vstack
(
[
a
,
b
]
)
print
c
print
d
|
Output:
1
2
3
|
[
1
2
3
4
5
6
]
[
[
1
2
3
]
[
4
5
6
]
]
|
三、矩阵对象
矩阵对象和数组的主要有两点差别:
- 矩阵是二维的,而数组的可以是任意正整数维
- 矩阵的’*’操作符进行的是矩阵乘法,乘号左侧的矩阵列和乘号右侧的矩阵行要相等,而在数组中’*’操作符进行的是每一元素的对应相乘,乘号两侧的数组每一维大小需要一致
1.创建矩阵
1
2
3
4
5
6
7
8
|
# -*- coding:utf-8 -*-
import
numpy
as
np
a
=
np
.
arange
(
5
)
a
=
np
.
mat
(
a
)
#use np.mat(a) or np.asmatrix(a)
print
a
,
type
(
a
)
b
=
np
.
mat
(
'1.0 2.0; 3.0 4.0'
)
# you can use np.matrix()
print
b
,
type
(
b
)
|
Output:
1
2
3
|
[
[
0
1
2
3
4
]
]
<
class
'numpy.matrixlib.defmatrix.matrix'
>
[
[
1.
2.
]
[
3.
4.
]
]
<
class
'numpy.matrixlib.defmatrix.matrix'
>
|
2.矩阵乘法
为了比较和数组的乘法,特地将b设为单位阵。
1
2
3
4
5
6
7
8
9
10
|
# -*- coding:utf-8 -*-
import
numpy
as
np
a
=
np
.
array
(
[
[
1
,
2
]
,
[
3
,
4
]
]
)
b
=
np
.
array
(
[
[
1
,
0
]
,
[
0
,
1
]
]
)
print
'a='
,
a
,
'\nb='
,
b
print
print
'array : a*b:'
print
a
*
b
print
'matrix: a*b:'
print
np
.
asmatrix
(
a
)
*
np
.
asmatrix
(
b
)
|
Output:
1
2
3
4
5
6
7
8
9
10
11
|
a
=
[
[
1
2
]
[
3
4
]
]
b
=
[
[
1
0
]
[
0
1
]
]
array
:
a
*
b
:
[
[
1
0
]
[
0
4
]
]
matrix
:
a
*
b
:
[
[
1
2
]
[
3
4
]
]
|
3.矩阵转置
1
2
3
4
5
|
# -*- coding:utf-8 -*-
import
numpy
as
np
a
=
np
.
array
(
[
[
1
,
2
,
3
]
,
[
4
,
5
,
6
]
]
)
print
np
.
transpose
(
a
)
#对于数组,用transpose
print
np
.
matrix
(
a
)
.
T
#对于矩阵,直接T
|
Output:
1
2
3
4
5
6
|
[
[
1
4
]
[
2
5
]
[
3
6
]
]
[
[
1
4
]
[
2
5
]
[
3
6
]
]
|
4.矩阵求逆
1
2
3
4
5
6
|
import
numpy
as
np
import
numpy
.
linalg
as
nlg
a
=
np
.
mat
(
[
[
1
,
2
]
,
[
4
,
4
]
]
)
print
a
b
=
nlg
.
inv
(
a
)
print
a
*
b
|
Output:
1
2
3
4
|
[
[
1
2
]
[
4
4
]
]
[
[
1.
0.
]
[
0.
1.
]
]
|
5.特征值和特征向量
1
2
3
4
5
6
7
8
|
import
numpy
as
np
import
numpy
.
linalg
as
nlg
a
=
np
.
random
.
rand
(
3
,
3
)
eig_value
,
eig_vector
=
nlg
.
eig
(
a
)
print
"eigen value:"
print
eig_value
print
"eigen vector:"
print
eig_vector
|
Output:
1
2
3
4
5
6
|
eigen
value
:
[
1.35205837
-
0.22652725
0.12474347
]
eigen
vector
:
[
[
-
0.66475046
-
0.42263921
0.031526
]
[
-
0.54161542
0.70097608
-
0.45506146
]
[
-
0.51454792
-
0.57446378
0.88990178
]
]
|
四、其它
1.缺失值处理
NumPy用nan作为缺失值,可以用isnan判定:
1
2
3
4
|
import
numpy
as
np
a
=
np
.
random
.
rand
(
2
,
2
)
a
[
0
,
1
]
=
np
.
nan
print
np
.
isnan
(
a
)
|
nan_to_num()可用来将nan替换成0
2.统计函数
np.bincount(a):对整数数组中各个元素出现的次数进行统计,它要求数组中所有元素都是非负的,返回值中,第i个元素表示第i个元素在a中出现的次数。
3.比较函数
直接用==比较
- 对于相同长度的,返回一个numpy数组,每个元素为相应位置上是否相等.
- 长度不相同,返回False
1
2
3
4
5
|
import
numpy
as
np
a
=
np
.
arange
(
5
)
b
=
np
.
array
(
[
0
,
1
,
2
,
4
,
3
]
)
print
a
==
b
print
a
==
np
.
array
(
[
0
,
1
,
2
,
4
,
3
,
5
]
)
|
Output:
1
2
|
[
True
True
True
False
False
]
False
|