学机器学习做点小笔记,都是Python的NumPy库的基本小操作,图书馆借的书看到的,怕自己还了书后忘了,就记下来。
一般习惯导入numpy时使用 import numpy as np ,不要直接import,会有命名空间冲突。比如numpy的array和python自带的array。
numpy下有两个可以做矩阵的东西,一个叫matrix,一个叫array。matrix指定是二维矩阵,array任意维度,所以matrix是array的分支,但是这个matrix和matlab的矩阵很像,操作也很像:
>>> import numpy as np
>>> a=np.mat(
'4 3; 2 1') # 使用字符串来初始化
>>> b=np.mat(
'1 2; 3 4')
>>> a
matrix(
[[4, 3],
[2, 1]])
>>> b
matrix(
[[1, 2],
[3, 4]])
>>> a+b # 对应位置相加
matrix(
[[5, 5],
[5, 5]])
>>> a*b # 矩阵乘法,与matlab相同
matrix(
[[13, 20],
[ 5, 8]])
>>> np.multiply(a,b) # 对应位置乘法,相当于matlab的点乘 “.*”
matrix(
[[4, 6],
[6, 4]])
而重点讲讲np.array。
np.array操作
首先是初始化与属性查看
>>> import numpy
as np
>>> np.arange(
10)
array([
0,
1,
2,
3,
4,
5,
6,
7,
8,
9])
>>> a=np.array([
0,
1,
2,
3,
4,
5])
>>> a
array([
0,
1,
2,
3,
4,
5])
>>> a.ndim
1
>>> a.shape
(
6,)
>>> a.dtype
dtype(
'int32')
reshape改变矩阵形状,可以改变维度,但是reshape后的数据还是共享原来那一份数据
>>> b=a.reshape(
3,
2)
>>> b
array(
[[0, 1],
[2, 3],
[4, 5]])
>>> b.ndim
2
>>> b.shape
(
3,
2)
>>> b[
1][
0]=
77
>>> b
array(
[[ 0, 1],
[77, 3],
[ 4, 5]])
>>> a
array([
0,
1,
77,
3,
4,
5]) # 可见b和a其实用的同一个数据
因而要产生的新矩阵不再关联,要使用copy():
>>> c=a.reshape(
3,
2).copy()
>>> c
array(
[[ 0, 1],
[77, 3],
[ 4, 5]])
>>> c[
0][
0]=
233
>>> a
array([
0,
1,
77,
3,
4,
5])
>>> c
array(
[[233, 1],
[ 77, 3],
[ 4, 5]])
array的运算:
>>> d=np.array([
1,
2,
3,
4,
5]) # 一维矩阵运算
>>> d.T # 转置矩阵
array([
1,
2,
3,
4,
5])
>>> d*
2 # 每个数据乘以
2
array([
2,
4,
6,
8,
10])
>>> d**
2 # 每个数据二次方
array([
1,
4,
9,
16,
25])
>>> d*d # 按位置乘,与“d**
2”等效,和mat正好相反
array([
1,
4,
9,
16,
25])
>>> d.dot(d) # 矩阵乘法,和mat相反
55
>>> x=np.array(
[[1,2],[3,4],[5,6]]) # 二维矩阵运算
>>> y=np.array(
[[6,5,4],[3,2,1]])
>>> x
array(
[[1, 2],
[3, 4],
[5, 6]])
>>> y
array(
[[6, 5, 4],
[3, 2, 1]])
>>> x.dot(y) # 二维矩阵矩阵乘法
array(
[[12, 9, 6],
[30, 23, 16],
[48, 37, 26]])
>>> x= x.reshape(
2,
3)
>>> x
array(
[[1, 2, 3],
[4, 5, 6]])
>>> x*y # 按位置乘,要求两个矩阵shape相同
array(
[[ 6, 10, 12],
[12, 10, 6]])
>>> x.T # 二维矩阵的转置矩阵
array(
[[1, 4],
[2, 5],
[3, 6]])
>>> x.mean() # 求平均值
3.5
关于下标的运算:(这些挺有意思的)
>>> a=np.
array([
5,
4,
3,
233,
9])
>>> a[np.
array([
2,
4,
3])]
array([
3,
9,
233])
>>> a>
4
array([
True,
False,
False,
True,
True], dtype=bool)
>>> a[a>
4]
array([
5,
233,
9])
>>> a[a>
8]=
8
>>> a
array([
5,
4,
3,
8,
8])
>>> a.clip(
4,
5)
array([
5,
4,
4,
5,
5])
还有一个关于nan的
>>> a=np.
array([
1,
2,
0,
3,
4])
>>> a
array([
1,
2,
0,
3,
4])
>>> b=np.
array([
1,
2,np.NAN,
3,
4])
>>> b
array([
1.,
2., nan,
3.,
4.])
>>> np.isnan(b)
array([
False,
False,
True,
False,
False], dtype=bool)
>>> b[~np.isnan(b)]
array([
1.,
2.,
3.,
4.])
与系统自带array的差异
array的乘法
>>>
[1,2,3,4,5]*2
[1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
>>>
[1,2,3,4,5]**2
(报错)
运行时间
对array和np.array进行按元素平方并求和的运算,运算3000次统计时间。
>>> timeit.timeit(
'sum(x*x for x in range(1000))',number=
3000)
0.31559807779291305
>>> timeit.timeit(
'sum(na*na)', setup=
'import numpy as np; na=np.arange(1000)',number=
3000)
0.37785958035067324
>>> timeit.timeit(
'na.dot(na)', setup=
'import numpy as np; na=np.arange(1000)',number=
3000)
0.0069067372806728144
惊奇的发现系统级的array求和比np.array还快,说明np.array单个数据的访问还是比array较慢。但是用了矩阵乘法后,虽然效果一样,但这个速度就飞起来了。
转载于:https://www.cnblogs.com/xienaoban/p/6798065.html