机器学习系列一:Numpy

一、numpy概述

numpy(Numerical Python)提供了python对多维数组对象的支持:ndarray,具有矢量运算能力,快速、节省空间。numpy支持高级大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。

二、创建ndarray数组

ndarray:N维数组对象(矩阵),所有元素必须是相同类型。 
ndarray属性:ndim属性,表示维度个数;shape属性,表示各维度大小;dtype属性,表示数据类型。

# -*- coding: utf-8 -*-

import numpy

print '使用列表生成一维数组'
data = [1,2,3,4]
x = numpy.array(data)
print data #列表 [1, 2, 3, 4]
print x #打印数组 [1 2 3 4]
print x.size #打印元数的个数 4
print x.shape #打印数组各个维度的长度 (4,)
print x.dtype #打印数组元素的类型 int64

print '使用列表生成二维数组'
data = [[1,2],[3,4],[5,6]]
x = numpy.array(data)
print x #打印数组 [[1 2][3 4][5 6]]
print x.ndim #打印数组的维度 2
print x.shape #打印数组各个维度的长度。shape是一个元组 (3,2)

print '使用zero/ones/empty创建数组:根据shape来创建'
x = numpy.zeros(6) #创建一维长度为6的,元素都是0一维数组
print x
x = numpy.zeros((2,3)) #创建一维长度为2,二维长度为3的二维0数组
print x
x = numpy.ones((2,3)) #创建一维长度为2,二维长度为3的二维1数组
print x
x = numpy.empty((3,3)) #创建一维长度为2,二维长度为3,未初始化的二维数组
print x

print '使用arrange生成连续元素'
print numpy.arange(6) # [0,1,2,3,4,5,] 开区间
print numpy.arange(0,6,2)  # [0, 2,4]

print '使用random生成随机数组:均匀分布'
x = x.random.random((2, 3)) #创建指定形状的数组(范围在0至1之间)
print x
x = np.random.rand(10, 10)#创建指定形状(示例为10行10列)的数组(范围在0至1之间, 均匀分布)
print x
x = np.random.randn(10, 10)#创建指定形状(示例为10行10列)的数组(标准正态分布)
print x
x = np.random.uniform(0, 100)#创建指定范围内的一个数
print x
x = np.random.randint(0, 100, 6).reshape(3, 2) #创建指定范围内的一个整数数组,3×2的数组
print x
x = np.random.randint(0, 100, size=(4, 4)) #创建指定范围内的一个整数数组,4×4的数组
print x

print '使用random生成随机数组:正态分布'
x = np.random.normal(0, 0.01, (3, 4))#均值为0,方差为0.01,3×4的数组
print x

三.ndarray的矢量化计算

矢量运算:相同大小的数组键间的运算应用在元素上 
矢量和标量运算:“广播”— 将标量“广播”到各个元素

print 'ndarray数组与标量/数组的运算'
x = numpy.array([1,2,3]) 
print x*2 # [2 4 6]
print x>2 # [False False  True]
print x == 2 #[False True False]
equal_to_two = (x == 2)
print x[equal_to_two] #[2]
y = numpy.array([3,4,5])
print x+y # [4 6 8]
print x>y # [False False False]

四.ndarray数组的基本索引和切片

一维数组的索引:与Python的列表索引功能相似

多维数组的索引:

  • arr[r1:r2, c1:c2]
  • arr[1,1] 等价 arr[1][1]
  • [:] 代表某个维度的数据
print 'ndarray的基本索引'
x = numpy.array([[1,2],[3,4],[5,6]])
print x[0] # [1,2]
print x[0][1] # 2,普通python数组的索引
print x[0,1] # 同x[0][1],ndarray数组的索引
x = numpy.array([[[1, 2], [3,4]], [[5, 6], [7,8]]])
print x[0] # [[1 2],[3 4]]
y = x[0].copy() # 生成一个副本
z = x[0] # 未生成一个副本
print y #  [[1 2],[3 4]]
print y[0,0] # 1
y[0,0] = 0 
z[0,0] = -1
print y # [[0 2],[3 4]]
print x[0] # [[-1 2],[3 4]]
print z # [[-1 2],[3 4]]

print 'ndarray的切片'
x = numpy.array([1,2,3,4,5])
print x[1:3] # [2,3] 右边开区间
print x[:3] # [1,2,3] 左边默认为 0
print x[1:] # [2,3,4,5] 右边默认为元素个数
print x[0:4:2] # [1,3] 下标递增2
x = numpy.array([[1,2],[3,4],[5,6]])
print x[:2] # [[1 2],[3 4]]
print x[:2,:1] # [[1],[3]]
x[:2,:1] = 0 # 用标量赋值
print x # [[0,2],[0,4],[5,6]]
x[:2,:1] = [[8],[6]] # 用数组赋值
print x # [[8,2],[6,4],[5,6]]

五.ndarray数组的布尔索引和花式索引 

布尔索引:使用布尔数组作为索引。arr[condition],condition为一个条件/多个条件组成的布尔数组。

print 'ndarray的布尔型索引'
x = numpy.array([3,2,3,1,3,0])
# 布尔型数组的长度必须跟被索引的轴长度一致
y = numpy.array([True,False,True,False,True,False]) 
print x[y] # [3,3,3] 
print x[y==False] # [2,1,0]
print x>=3 # [ True False  True False  True  False]
print x[~(x>=3)] # [2,1,0]
print (x==2)|(x==1) # [False  True False  True False False]
print x[(x==2)|(x==1)] # [2 1]
x[(x==2)|(x==1)] = 0
print x # [3 0 3 0 3 0]

花式索引:使用整型数组作为索引。

print 'ndarray的花式索引:使用整型数组作为索引'
x = numpy.array([1,2,3,4,5,6])
print x[[0,1,2]] # [1 2 3]
print x[[-1,-2,-3]] # [6,5,4]
x = numpy.array([[1,2],[3,4],[5,6]])
print x[[0,1]] # [[1,2],[3,4]]
print x[[0,1],[0,1]] # [1,4] 打印x[0][0]和x[1][1]
print x[[0,1]][:,[0,1]] # 打印01行的01列 [[1,2],[3,4]]
# 使用numpy.ix_()函数增强可读性
print x[numpy.ix_([0,1],[0,1])] #同上 打印01行的01列 [[1,2],[3,4]]
x[[0,1],[0,1]] = [0,0]
print x # [[0,2],[3,0],[5,6]]

六.ndarray数组的转置和轴对换

数组的转置/轴对换只会返回源数据的一个视图,不会对源数据进行修改。

print 'ndarray数组的转置和轴对换'
k = numpy.arange(9) #[0,1,....8]
m = k.reshape((3,3)) # 改变数组的shape复制生成2维的,每个维度长度为3的数组
print k # [0 1 2 3 4 5 6 7 8]
print m # [[0 1 2] [3 4 5] [6 7 8]]
# 转置(矩阵)数组:T属性 : mT[x][y] = m[y][x]
print m.T # [[0 3 6] [1 4 7] [2 5 8]]
# 计算矩阵的内积 xTx
print numpy.dot(m,m.T) # numpy.dot点乘
# 高维数组的轴对象
k = numpy.arange(8).reshape(2,2,2)
print k # [[[0 1],[2 3]],[[4 5],[6 7]]]
print k[1][0][0]
# 轴变换 transpose 参数:由轴编号组成的元组
m = k.transpose((1,0,2)) # m[y][x][z] = k[x][y][z]
print m # [[[0 1],[4 5]],[[2 3],[6 7]]]
print m[0][1][0]
# 轴交换 swapaxes (axes:轴),参数:一对轴编号
m = k.swapaxes(0,1) # 将第一个轴和第二个轴交换 m[y][x][z] = k[x][y][z]
print m # [[[0 1],[4 5]],[[2 3],[6 7]]]
print m[0][1][0]
# 使用轴交换进行数组矩阵转置
m = numpy.arange(9).reshape((3,3))
print m # [[0 1 2] [3 4 5] [6 7 8]]
print m.swapaxes(1,0) # [[0 3 6] [1 4 7] [2 5 8]]

七.ndarray通用函数

通用函数(ufunc)是一种对ndarray中的数据执行元素级运算的函数。

通用函数(即ufunc)是一种对ndarray中的数据执行元素级运算的函数。你可以将其看做简单函数(接受一个或多个标量值,并产生一个或多个标量值)的矢量化包装器。

print '一元ufunc示例'
x = numpy.arange(6)
print x # [0 1 2 3 4 5]
print numpy.square(x) # [ 0  1  4  9 16 25]
x = numpy.array([1.5,1.6,1.7,1.8])
y,z = numpy.modf(x)
print y # [ 0.5  0.6  0.7  0.8]
print z # [ 1.  1.  1.  1.]

 

print '二元ufunc示例'
x = numpy.array([[1,4],[6,7]])
y = numpy.array([[2,3],[5,8]])
print numpy.maximum(x,y) # [[2,4],[6,8]]
print numpy.minimum(x,y) # [[1,3],[5,7]]
A = np.array([[1,1],[0,1]])
B = np.array([[2,0],[3,4]])
print A
print B
print A*B #对应元素相乘[[2 0][0 4]]
print np.multiply(A,B)#对应元素相乘[[2 0][0 4]]
print A.dot(B) #矩阵乘法[[5 4][3 4]]
print np.dot(A,B)#矩阵乘法[[5 4][3 4]]

八.利用数组进行数据处理

NumPy数组使你可以将许多种数据处理任务表述为简洁的数组表达式(否则需要编写循环)。用数组表达式代替循环的做法,通常被称为矢量化。一般来说,矢量化数组运算要比等价的纯Python方式快上一两个数量级(甚至更多),尤其是各种数值计算。

猜你喜欢

转载自blog.csdn.net/qq_36086861/article/details/85235822
今日推荐