机器学习笔记3_numpy入门
目录
前言
import numpy as np
import array
array模块
该模块的函数可以创建都是同一种数据类型的列表,在定义时需要先声明。
arr = array.array('i',[i for i in range(10)])
arr[5]
numpy模块
array的创建若是刚开始都是Integer,则这个array的dtype就是integer类型
对integer的array赋值3.14(浮点数)是不行的
若是想创建dtype为float的array,则在创建数组时写成小数(例子:3.0)
arr1 = np.array([i for i in range (5)])
arr1[3] = 3.0
arr1
numpy创建数组
同一个数的数组
- np.zeros(size = (2,3), dtype = ‘int64’)
- np.ones(size = (2,3), dtype = ‘int64’)
- np.full(shape, fill_value, dtype=None, order=‘C’)
连续数的数组
- np.arange(start,stop, step, dtype=None)
- np.linspace(start,stop,num=50,endpoint=True,retstep=False,dtype=None,axis=0)
随机数的数组
- np.random.randint(start,stop,size)
- np.random.random(size) # 默认0-1中取随机数
- np.random.seed(label_num)
- np.random.nomal(loc=0.0, scale=1.0, size=None)
其中,所有当有(start,stop)的函数的区间的开闭应该被注意,一般为左闭右开
但是,np.linspace的(start,stop)是一定会包含到数组中的!
array的属性,方法以及取值
array的取值
某行某列数据取值(一个数值)
- array1[1][1] # 这是一个很差的方法
- array1(1,1) # 正确的方法
切片取值
理解以下切片的取值
- array1(:5,:5) # **切片的取值也是左关右闭
- array1(1:5,1:6:-1)
- array1(1:5,1:6:2)
array1[2:4][3:5]指的是什么?,如下所示:
array1 = np.random.randint(1,10,size=(5,5))
array1[:3][:3]
array([[4, 1, 1, 1, 6],
[1, 1, 5, 1, 5],
[1, 7, 9, 6, 8]])
上述取值方法与我们想表达的不同,故我们不用[][]的方式为数组取值。
array的属性以及方法
属性
- array.size
- array.dtype
- array,ndim
- array.shape
方法
- array2 = array2.reshape(3,5)
- array2 = array1.copy()
array2.reshape(2,-1) # 其中的-1指的是什么?
切片和reshape的赋值问题
在python中
当:
‘’’
sublist = list[3:10]
sublist[5] = 999
‘’’
最后会改变sublist的值吗?(不会)因为切片后就是新的一个列表
在numpy中
- 切片的赋值
subarray = array[3:10]
subarray[5] = 999
array的值会改变吗?(会)numpy中的切片仍是原array
如何修改subarray而不修改原数组,可以用.copy()的方法
- reshape的赋值
array2 = array1.reshape(3,5)
array的shape改变了吗?没有,这个方法是有返回值不改变原对象的!
numpy数组的合并与分割
有如下方法:
array的数直合并和水平合并
分别为:np.vstack([arr1,arr2])和np.hstack([arr1,arr2])
这里的v和h指的是两个数组合并vertical 和 horizontal
arr1 = np.arange(15).reshape(3,5)
arr2 = np.vstack([arr1,arr1]) # 此处的[]为必须药添加的
arr2
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
arr1 = np.arange(15).reshape(3,5)
arr2 = np.hstack([arr1,arr1]) # 此处的[]为必须药添加的
arr2
array([[ 0, 1, 2, 3, 4, 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9, 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14, 10, 11, 12, 13, 14]])
水平水平分割和竖直分割
分别为:np.vsplit(arr1,[2])和np.hsplit(arr1,[-1]) # 这里的3是指从第2行开始分割和倒数第一列开始分割
尤其注意:vsplit指的是数据切割后的新array是竖直排列的, hsplit指的是数据切割后的新array是水平排列的
arr1 = np.arange(54).reshape(6,9)
V1, V2 = np.vsplit(arr1,[3]) # 此处的[]为必须药添加的,从第三列开始切割
H1, H2 = np.hsplit(arr1,[-1]) # 此处的[]为必须药添加的,从倒数第1行开始切割
V1
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8],
[ 9, 10, 11, 12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23, 24, 25, 26]])
V2
array([[27, 28, 29, 30, 31, 32, 33, 34, 35],
[36, 37, 38, 39, 40, 41, 42, 43, 44],
[45, 46, 47, 48, 49, 50, 51, 52, 53]])
H1
array([[ 0, 1, 2, 3, 4, 5, 6, 7],
[ 9, 10, 11, 12, 13, 14, 15, 16],
[18, 19, 20, 21, 22, 23, 24, 25],
[27, 28, 29, 30, 31, 32, 33, 34],
[36, 37, 38, 39, 40, 41, 42, 43],
[45, 46, 47, 48, 49, 50, 51, 52]])
H2
array([[ 8],
[17],
[26],
[35],
[44],
[53]])
hsplit 常常用于分离标签与数据