机器学习-->python常用知识点

本篇博文主要总结下机器学习中,利用python进行编程,必须知道,必须掌握,但是往往又忽视的一些知识点。

标准Python的列表(list)中,元素本质是对象。
如:L = [1, 2, 3],需要3个指针和三个整数对象,对于数值运算比较浪费内存和CPU。
因此,Numpy提供了ndarray(N-dimensional array object)对象:存储单一数据类型的多维数组。

使用array创建
通过array函数传递list对象
L = [1, 2, 3, 4, 5, 6]
a = np.array(L)
print type(a), type(L) 
# 若传递的是多层嵌套的list,将创建多维数组
b = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
# 也可以强制修改shape
b.shape = 4, 3
注:从(3,4)改为(4,3)并不是对数组进行转置,而只是改变每个轴的大小,数组元素在内存中的位置并没有改变
b.shape = 2, -1# 当某个轴为-1时,将根据数组元素的个数自动计算此轴的长度

# 使用reshape方法,可以创建改变了尺寸的新数组,原数组的shape保持不变
c = b.reshape((4, -1)) #注意这里是添加了一个副本,原始的数组没变,并且数组b和c共享内存,修改任意一个将影响另外一个

print a.dtype# 数组的元素类型可以通过dtype属性获得
d = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]], dtype=np.float)# 可以通过dtype参数在创建时指定元素类型
f = d.astype(np.int)# 如果更改元素类型,可以使用astype安全的转换

使用函数创建
# 如果生成一定规则的数据,可以使用NumPy提供的专门函数
# arange函数类似于python的range函数:指定起始值、终止值和步长来创建数组
# 和Python的range类似,arange同样不包括终值;但arange可以生成浮点类型,而range只能是整数类型
a = np.arange(1, 10, 0.5)
b = np.linspace(1, 10, 10)# linspace函数通过指定起始值、终止值和元素个数来创建数组,缺省包括终止值
c = np.linspace(1, 10, 10, endpoint=False) # 可以通过endpoint关键字指定是否包括终值
logspace可以创建等比数列
d = np.logspace(1, 2, 9, endpoint=True)# 下面函数创建起始值为10^1,终止值为10^2,有10个数的等比数列
f = np.logspace(0, 10, 11, endpoint=True, base=2)# 下面创建起始值为2^0,终止值为2^10(包括),有10个数的等比数列

存取
# 3.1常规办法:数组元素的存取方法和Python的标准方法相同
a = np.arange(10)
print a[1:9:2]# 步长为2
print a[::-1]# 步长为-1,即翻转
# 切片数据是原数组的一个视图,与原数组共享内存空间,可以直接修改元素值
a[1:4] = 10, 20, 30
# # 因此,在实践中,切实注意原始数据是否被破坏,如:
b = a[2:5]
b[0] = 200  ## 注意此时虽然修改的是b,但是实际上a也被修改了
即是修改切片,那么原始数据也发生改变。

整数/布尔数组存取
根据整数数组存取:当使用整数序列对数组元素进行存取时,
将使用整数序列中的每个元素作为下标,整数序列可以是列表(list)或者数组(ndarray)。
使用整数序列作为下标获得的数组不和原始数组共享数据空间。
a = np.logspace(0, 9, 10, base=2)
i = np.arange(0, 10, 2)
# 利用i取a中的元素
b = a[i]
b[2] = 1.6# b的元素更改,a中元素不受影响
即是利用下标修改元素值,原始数据不发生改变。同理利用布尔来修改元素值,原始数据也不发生改变

a = np.arange(0, 60, 10).reshape((-1, 1)) + np.arange(6) 
np.arange(0, 60, 10).reshape((-1, 1)) #表示0-60,但是不包含60,将其reshape成一个列向量。
np.arange(6) # 表示一个行向量。
那么列向量加上行向量,表示列向量中每个元素加上行向量所有元素得到一个行向量,那么列向量中每个元素分别加上行向量就得到二维数组。

[[ 0 1 2 3 4 5]
[10 11 12 13 14 15]
[20 21 22 23 24 25]
[30 31 32 33 34 35]
[40 41 42 43 44 45]
[50 51 52 53 54 55]]

二维数组上切片
print a[[0,1,2],[2,3,4]] #表示取出这个二维数组的第0行第2列,第1行第3列,第2行第4列。
print a[4,[2,3,4]] # 广播,取出a[4,2],a[4,3],a[4,4]
print a[1:2,3:4] #逗号就划分了维度

stack and axis
a = np.arange(1, 10).reshape((3, 3))
b = np.arange(11, 20).reshape((3, 3))
c = np.arange(101, 110).reshape((3, 3))
print ‘a = \n’, a
print ‘b = \n’, b
print ‘c = \n’, c
print ‘axis = 0 \n’, np.stack((a, b, c), axis=0)
print ‘axis = 1 \n’, np.stack((a, b, c), axis=1)
print ‘axis = 2 \n’, np.stack((a, b, c), axis=2)
打印结果:
axis = 0
[[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]]

[[ 11 12 13]
[ 14 15 16]
[ 17 18 19]]

[[101 102 103]
[104 105 106]
[107 108 109]]]
axis = 1
[[[ 1 2 3]
[ 11 12 13]
[101 102 103]]

[[ 4 5 6]
[ 14 15 16]
[104 105 106]]

[[ 7 8 9]
[ 17 18 19]
[107 108 109]]]
axis = 2
[[[ 1 11 101]
[ 2 12 102]
[ 3 13 103]]

[[ 4 14 104]
[ 5 15 105]
[ 6 16 106]]

[[ 7 17 107]
[ 8 18 108]
[ 9 19 109]]]

注意:axis=0,表示以整个数组进行堆叠,axis=1表示所有数组中对应每行进行堆叠,axis=3表示三个数组中对应的元素进行堆叠

矩阵乘法
a = np.arange(1, 10).reshape(3,3)
b = a + 10
np.dot(a, b) ##正常的矩阵乘法
a * b ##表示两矩阵对应元素相乘

你可能感兴趣的:(机器学习-python)