【机器学习】——Numpy:基本操作快速入门
目录
Numpy是一个用python实现的科学计算的扩展程序库,包括:
- 1、一个强大的N维数组对象Array;
- 2、比较成熟的(广播)函数库;
- 3、用于整合C/C++和Fortran代码的工具包;
- 4、实用的线性代数、傅里叶变换和随机数生成函数。numpy和稀疏矩阵运算包scipy配合使用更加方便。
1.Numpy基本操作
1.1 列表转为矩阵
[[1 3 5] [4 6 9]]
1.2 维度
number of dim: 2
1.3 行数和列数()
shape: (2, 3)
1.4 元素个数
size: 6
2.Numpy创建array
2.1 一维array创建
[ 2 23 4]
int32
2.2 多维array创建
2.3 创建全零数组
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
2.4 创建全1数据
[[1 1 1 1]
[1 1 1 1]
[1 1 1 1]]
2.5 创建全空数组
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
2.6 创建连续数组
[10 12 14 16 18 20]
2.7 reshape操作
[[10 12 14]
[16 18 20]]
2.8 创建连续型数据
[ 1. 1.47368421 1.94736842 2.42105263 2.89473684 3.36842105
3.84210526 4.31578947 4.78947368 5.26315789 5.73684211 6.21052632
6.68421053 7.15789474 7.63157895 8.10526316 8.57894737 9.05263158
9.52631579 10. ]
2.9 linspace的reshape操作
[[ 1. 1.47368421 1.94736842 2.42105263]
[ 2.89473684 3.36842105 3.84210526 4.31578947]
[ 4.78947368 5.26315789 5.73684211 6.21052632]
[ 6.68421053 7.15789474 7.63157895 8.10526316]
[ 8.57894737 9.05263158 9.52631579 10. ]]
3.Numpy基本运算
3.1 一维矩阵运算
[10 20 30 40] [0 1 2 3]
[10 19 28 37]
[ 0 20 60 120]
[0 1 4 9]
[-0.54402111 0.91294525 -0.98803162 0.74511316]
[ True True False False]
[False True False True]
3.2 多维矩阵运算
[[1 1]
[0 1]]
[[0 1]
[2 3]]
[[2 4]
[2 3]]
[[2 4]
[2 3]]
3.825517216750851
0.09623355767721398
0.7420428188342583
a= [[0.48634962 0.74204282 0.09623356 0.69074812]
[0.60218881 0.52734181 0.41434585 0.26626662]]
如果你需要对行或者列进行查找运算,
就需要在上述代码中为 axis 进行赋值。
当axis的值为0的时候,将会以列作为查找单元,
当axis的值为1的时候,将会以行作为查找单元。
sum= [2.01537412 1.8101431 ]
min= [0.48634962 0.52734181 0.09623356 0.26626662]
max= [0.74204282 0.60218881]
3.3 基本计算
[[ 2 3 4 5]
[ 6 7 8 9]
[10 11 12 13]]
0
11
7.5
7.5
7.5
7.5
[ 2 5 9 14 20 27 35 44 54 65 77 90]
[[2 4]
[4 2]]
(array([0, 0, 0, 1, 1, 1], dtype=int64), array([0, 1, 2, 0, 1, 2], dtype=int64))
(array([0, 0, 1, 1], dtype=int64), array([1, 2, 0, 2], dtype=int64))
[[14 13 12 11]
[10 9 8 7]
[ 6 5 4 3]]
[[11 12 13 14]
[ 7 8 9 10]
[ 3 4 5 6]]
[[14 10 6]
[13 9 5]
[12 8 4]
[11 7 3]]
[[14 10 6]
[13 9 5]
[12 8 4]
[11 7 3]]
[[14 13 12 11]
[10 9 8 7]
[ 6 5 4 3]]
[[9 9 9 9]
[9 9 8 7]
[6 5 5 5]]
clip(Array,Array_min,Array_max)
将Array_min<X<Array_max X表示矩阵A中的数,如果满足上述关系,则原数不变。
否则,如果X<Array_min,则将矩阵中X变为Array_min;
如果X>Array_max,则将矩阵中X变为Array_max.
4.Numpy索引与切片
[ 3 4 5 6 7 8 9 10 11 12 13 14]
6
[[ 3 4 5 6]
[ 7 8 9 10]
[11 12 13 14]]
[11 12 13 14]
5
5
[8 9]
[3 4 5 6]
[ 7 8 9 10]
[11 12 13 14]
[ 3 7 11]
[ 4 8 12]
[ 5 9 13]
[ 6 10 14]
[ 3 4 5 6 7 8 9 10 11 12 13 14]
3
4
5
6
7
8
9
10
11
12
13
14
我们一起来来总结一下,看下面切片取值方式(对应颜色是取出来的结果):
5.Numpy array合并
5.1 数组合并
[[1 1 1]
[2 2 2]]
[[1 1 1]
[2 2 2]]
(3,) (3,) (2, 3)
[1 1 1 2 2 2]
(3,) (3,) (6,)
5.2 数组转置为矩阵
[[1 1 1]]
(1, 3)
[[1]
[1]
[1]]
5.3 多个矩阵合并
------------
(3, 1)
[[1]
[1]
[1]]
[[2]
[2]
[2]]
[[1]
[1]
[1]
[2]
[2]
[2]
[2]
[2]
[2]
[1]
[1]
[1]]
[[1 2]
[1 2]
[1 2]]
5.4 合并例子2
-------------
[[0 1 2 3]
[4 5 6 7]]
[[0 1 2 3]
[4 5 6 7]]
-------------
[[0 1 2 3]
[4 5 6 7]
[0 1 2 3]
[4 5 6 7]]
[[0 1 2 3 0 1 2 3]
[4 5 6 7 4 5 6 7]]
6.Numpy array分割
6.1 构造3行4列矩阵
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
6.2 等量分割
[array([[0, 1],
[4, 5],
[8, 9]]), array([[ 2, 3],
[ 6, 7],
[10, 11]])]
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
6.3 不等量分割
[array([[0, 1],
[4, 5],
[8, 9]]), array([[ 2],
[ 6],
[10]]), array([[ 3],
[ 7],
[11]])]
6.4 其他的分割方式
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
[array([[0, 1],
[4, 5],
[8, 9]]), array([[ 2, 3],
[ 6, 7],
[10, 11]])]
7.Numpy copy与 =
7.1 =赋值方式会带有关联性
[0 1 2 3]
[11 1 2 3]
[11 1 2 3]
[11 1 2 3]
[11 1 2 3]
True
True
True
[11 22 33 3]
[11 22 33 3]
[11 22 33 3]
7.2 copy()赋值方式没有关联性
[0 1 2 3]
[0 1 2 3]
[ 0 1 2 44]
[0 1 2 3]
8.广播机制
numpy数组间的基础运算是一对一,也就是a.shape==b.shape
,但是当两者不一样的时候,就会自动触发广播机制,如下例子:
[[ 0 1 2]
[10 11 12]
[20 21 22]
[30 31 32]]
为什么是这个样子?
这里以tile模拟上述操作,来回到a.shape==b.shape
情况!
[[ 0 1 2]
[10 11 12]
[20 21 22]
[30 31 32]]
到这里,我们来给出一张图
是不是任何情况都可以呢?
当然不是,只有当两个数组的trailing dimensions compatible
时才会触发广播,否则报错ValueError: frames are not aligned exception
。
上面表达意思是尾部维度必须兼容!
9.常用函数
9.1 np.bincount()
array([1, 2, 1, 2, 1], dtype=int64)
统计索引出现次数:索引0出现1次,1出现2次,2出现1次,3出现2次,4出现1次
因此通过bincount计算出索引出现次数如下:
上面怎么得到的?
对于bincount计算吗,bin的数量比x中最大数多1,例如x最大为4,那么bin数量为5(index从0到4),也就会bincount输出的一维数组为5个数,bincount中的数又代表什么?代表的是它的索引值在x中出现的次数!
还是以上述x为例子,当我们设置weights参数时候,结果又是什么?
这里假定:
w = np.array([0.3,0.5,0.7,0.6,0.1,-0.9,1])
那么设置这个w权重后,结果为多少?
array([ 0.1, -0.6, 0.5, 1.3, 1. ])
怎么计算的?
先对x与w抽取出来:
x ---> [1, 2, 3, 3, 0, 1, 4]
w ---> [0.3,0.5,0.7,0.6,0.1,-0.9,1]
索引 0 出现在x中index=4位置,那么在w中访问index=4的位置即可,w[4]=0.1
索引 1 出现在x中index=0与index=5位置,那么在w中访问index=0
与index=5
的位置即可,然后将两这个加和,计算得:w[0]+w[5]=-0.6
其余的按照上面的方法即可!
bincount的另外一个参数为minlength,这个参数简单,可以这么理解,当所给的bin数量多于实际从x中得到的bin数量后,后面没有访问到的设置为0即可。
还是上述x为例:
这里我们直接设置minlength=7参数,并输出!
array([ 0.1, -0.6, 0.5, 1.3, 1. , 0. , 0. ])
与上面相比多了两个0,这两个怎么会多?
上面知道,这个bin数量为5,index从0到4,那么当minlength为7的时候,也就是总长为7,index从0到6,多了后面两位,直接补位为0即可!
9.2 np.argmax()
函数原型为:numpy.argmax(a, axis=None, out=None)
.
函数表示返回沿轴axis最大值的索引。
3
对于这个例子我们知道,7最大,索引位置为3(这个索引按照递增顺序)!
axis属性
axis=0表示按列操作,也就是对比当前列,找出最大值的索引!
[1 1 0]
axis=1表示按行操作,也就是对比当前行,找出最大值的索引!
[1 1 0]
那如果碰到重复最大元素?
返回第一个最大值索引即可!
例如:
1
9.3 上述合并实例
这里来融合上述两个函数,举个例子:
1
最终结果为1,为什么?
首先通过np.bincount(x)
得到的结果是:[1 2 1 2 1]
,再根据最后的遇到重复最大值项,则返回第一个最大值的index即可!2的index为1,所以返回1。
9.4 求取精度
array([-1., 1., 2., 10., 13.])
看到没,负数进位取绝对值大的!
array([ 1.3, 2.4, 9.7, 13. ])
array([ 1.28, 2.36, 9.67, 13. ])
从上面可以看出,decimals表示指定保留有效数的位数,当超过5就会进位(此时包含5)!
但是,如果这个参数设置为负数,又表示什么?
array([ 0, 0, 0, 10, 60])
发现没,当超过5时候(不包含5),才会进位!-1表示看一位数进位即可,那么如果改为-2呢,那就得看两位!
array([ 0, 0, 0, 0, 100, 200])
看到没,必须看两位,超过50才会进位,190的话,就看后面两位,后两位90超过50,进位,那么为200!
计算沿指定轴第N维的离散差值
[[ 1 2 3 4 5]
[ 6 7 8 9 10]
[11 12 13 14 15]]
array([[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]])
array([[5, 5, 5, 5, 5],
[5, 5, 5, 5, 5]])
取整
array([-1., -2., -1., -2., 0., 1., 1.])
看到没,负数取整,跟上述的around一样,是向左!
取上限
array([ 2., 2., 2., 3., 2., -0., -0., -0.])
取上限!找这个小数的最大整数即可!
查找
利用np.where实现小于0的值用0填充吗,大于0的数不变!
[[ 1 0]
[ 2 -2]
[-2 1]]
array([[1, 0],
[2, 0],
[0, 1]])
- 点赞
- 收藏
- 关注作者
评论(0)