python(一):Numpy

Numpy

  • Numpy简介----用于机器学习
  • Numpy基础
    • ndarray对象
    • 导入模块
    • 创建数组(矩阵)
    • 初始化数组
    • Numpy文件读写
    • Numpy数据类型
    • 查看Numpy矩阵信息
    • Numpy的随机数子库
    • Numpy数组运算
      • 算术运算
      • 数组比较
      • 聚合函数
    • 复制数组
    • 数组元素排序
    • 数组切片,子集,索引
    • 数组操作
    • 实例:
  • 参考:

Numpy简介----用于机器学习

Numpy是一个开源的python科学计算库

  • 拥有一个强大的N维数组对象ndarray

  • 广播功能函数

  • 具有线性代数、傅里叶变换、随机数生成等功能
    Numpy是Scipy、pandas等数据处理与科学计算库的基础

  • Pandas数据操作库建立在NumPy之上,但它使用了另外两种基本数据结构而不是数组:Series和DataFrames,

  • SciPy以Numpy为基础,提供大量可在NumPy矩阵上运行的函数

  • 机器学习库Scikit-Learn不仅可以在NumPy上构建,还可以在SciPy和Matplotlib上构建。

Numpy基础

ndarray对象

ndarray是一个多维数组对象,由两部分组成:

  • 实际的数据
  • 描述这些数据的元数据(数据维度(shape),数据类型(dtype)等)

ndarray的一个别名是array

导入模块

import numpy as np
#插入numpy库

python(一):Numpy_第1张图片

创建数组(矩阵)

Note:
Numpy数组与python列表不一样!!

a = np.array([1,2,3])
#还可以通过列表或者元组创建ndarray数组对象,np.array(list/turple,dtype=np.float32)
#一维数组
b = np.array([(1.5,2,3),(4,5,6)],dtype=float)
#二维数组
c = np.array([(1.5,2,3),(4,5,6)],[(3,2,1),(4,5,6)],dtype=float)
#创建2*2*1的3D数组,数组元素类型为float

初始化数组

np.zeros((3,4))
#创建零数组
np.ones((2,3,4),dtype=np.int16)
#创建一数组

结果
python(一):Numpy_第2张图片

d = np.arange(10,25,5)
#类似于range()函数
#结果:(10,15,20)

np.linspace(0,2,9)

结果
生成array对象:
在这里插入图片描述
.linspace()函数还有一个参数endpoint,若其为False则最后一个元素不计入数组

np.concatenate((a,b))
#将两个向量合成一个向量
np.full((2,3),4)
#创建2*3的数组元素全为4的矩阵
np.eye(5)
#创建5维单位矩阵
np.random.random((2,3))
#创建2*3的随机数矩阵
np.empty((4,3))
#创建4*3的空矩阵

Numpy文件读写

>>> np.save("a.npy", a)
>>> c = np.load( "a.npy" )
>>> c
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
np.savez('array.npz', a, b)
#保留多个数组在同一个文件中

savez函数的第一个参数是文件名,其后的参数都是需要保存的数组,也可以使用关键字参数为数组起一个名字,非关键字参数传递的数组会自动起名为arr_0, arr_1, …。savez函数输出的是一个压缩文件(扩展名为npz),其中每个文件都是一个save函数保存的npy文件,文件名对应于数组名。load函数自动识别npz文件,并且返回一个类似于字典的对象

>>> a = np.array([[1,2,3],[4,5,6]])
>>> b = np.arange(0, 1.0, 0.1)
>>> c = np.sin(b)
>>> np.savez("result.npz", a, b, sin_array = c)
>>> r = np.load("result.npz")
>>> r["arr_0"] # 数组a
array([[1, 2, 3],
       [4, 5, 6]])
>>> r["arr_1"] # 数组b
array([ 0. ,  0.1,  0.2,  0.3,  0.4,  0.5,  0.6,  0.7,  0.8,  0.9])
>>> r["sin_array"] # 数组c
array([ 0.        ,  0.09983342,  0.19866933,  0.29552021,  0.38941834,
        0.47942554,  0.56464247,  0.64421769,  0.71735609,  0.78332691])

读取保存CSV文件:
何为csv文件:CSV(comma-separated value 逗号分隔值)
csv是一种文件存储格式,用来存储批量数据
python(一):Numpy_第3张图片

np.savetxt(frame, array, fmt="%.18e", delimiter = None)
#保存为文件

frame: 文件、字符串或产生器,可以是.gz或.bz2的压缩文件
array: 存入文件的数组
fmt: 写入文件的格式
delimiter: 分割字符串,默认是空格

eg:

a = np.arange(100).reshape(2,50)
np.savetxt('a.csv', a, fmt = '%d', delimiter = ',')
np.loadtxt(frame, dtype = np.float, delimiter = None, unpack = False)
#读取文件,并将文件数据保存为ndarray数组对象

unpack: 若其值为True,读入的属性将写入不同的变量
CSV文件的局限性: 只能存储读取一维或者二维数组

用Numpy存取多维数组

a.tofile(frame, seq = ' ', format = '%s')
#把a数组保存为文件

frame: 文件、字符串
seq: 数据分割字符串,如果是空串,写入文件为二进制
format: 写入数据的格式

eg:

a = np.arange(100),reshape(2,50)
a.tofile('b.bat', seq = ',', format = '%d')
np.fromfile(frame, dtype = float, count = -1, seq = '')
#从文件中读取数组

count: 读入元素的个数,若为-1则读取整个文件
seq: 数据分割字符串,如果是空串,写入文件为二进制

Notes:
使用该方法需要知道存入数组时的维度和元素类型


Numpy数据类型

>>> np.int64            有符号的64位整型
>>> np.int16            有符号的16位整型
>>> np.float            单精度类型
>>> np.float32          双精度浮点型
>>> np.complex          用128位浮点数表示的复数类型
>>> np.bool             布尔型
>>> np.object           Python对象类型
>>> np.string_          固定长度的字符串类型
>>> np.unicode_         固定长度的unicode类型

查看Numpy矩阵信息

>>> a = np.eye(5)
>>>a.ndim #显示数组(矩阵)的秩(准确的说是轴的数量或者维度的数量)
>2
>>> a.shape #查看数组维数
>(5,5)
>>> len(a) #查看数组长度
>5
>>> a.size #数组元素总数
>25
>>> a.dtype #数组元素数据类型
>dtype('float64')
>>> a.dtype.name 
>'float64'
>>> a.astype(int) #类型转换   一定会创建一个新的数组

Numpy的随机数子库

np.random的随机数函数

python(一):Numpy_第4张图片
python(一):Numpy_第5张图片
python(一):Numpy_第6张图片
示例
python(一):Numpy_第7张图片
python(一):Numpy_第8张图片
np.random的梯度函数
python(一):Numpy_第9张图片
示例
python(一):Numpy_第10张图片

Numpy数组运算

算术运算

Tips: 数组与标量的运算会应用到数组上的每一个元素。

>>> a = np.zeros((2,3))
>>> b = np.array([(0.5,0,0),(3,3,3)])
>>> g = a - b #数组减法
>array([[-0.5, 0. , 0. ],
 [-3. , -3. , -3. ]])
>>> np.subtract(a,b)
>array([[-0.5, 0. , 0. ],
 [-3. , -3. , -3. ]])
 
>>> b + a #数组加法
>array([[0.5, 0. , 0. ],
       [3. , 3. , 3. ]])
>>> np.add(b,a) 
>array([[0.5, 0. , 0. ],
       [3. , 3. , 3. ]])

>>> a = np.ones((2,3))
>>> b = np.full((2,3),2)       
>>> a / b #数组除法(对应数组元素相除)
>array([[0.5, 0.5, 0.5],
       [0.5, 0.5, 0.5]])
>>> np.divide(a,b)
>array([[0.5, 0.5, 0.5],
       [0.5, 0.5, 0.5]])
 
 >>> a=np.array([(1,2,3),(4,5,6)])
>>> b=np.array([(3,2,1),(6,5,4)])
>>> a * b #数组乘法(对应元素的乘法)
>array([[ 3,  4,  3],
       [24, 25, 24]])
>>> np.multiply(a,b) 

>>> np.exp(b) #e的幂,指数为b的数组元素
>>> np.sqrt(b) #取b数组元素的平方根
>>> np.square(b) #计算数组每个元素的平方
>>> np.sin(a) 
>>> np.cos(b) 
>>> np.log(a) #每个元素的自然对数,.log2()和.log10()分别表示2为底对数和10为底对数

矩阵乘法

>>> c
array([1, 2, 3])
>>> d
array([2, 3, 4])
>>> np.dot(c,d)
20

数组比较

>>> a == b #每个对应的数组元素判断是否相等
>array([[False,  True, False],
       [False,  True, False]])
>>> a < 2 #判断数组中是否每个元素都小于2
>array([[ True, False, False],
       [False, False, False]])
>>> np.array_equal(a, b) 
>False

聚合函数

python(一):Numpy_第11张图片
python(一):Numpy_第12张图片

>>> a.sum() 
>>> a.min()
>>> b=np.array([(3,2,1),(1,4,0.5),(1,3,4),(0,0,100)])
> b
array([[  3. ,   2. ,   1. ],
       [  1. ,   4. ,   0.5],
       [  1. ,   3. ,   4. ],
       [  0. ,   0. , 100. ]])
>>> b.max(axis=0)#axis=0表示求每一列中的最大值,axis=1表示求每一行中的最大值
> array([  3.,   4., 100.])
>>> b.max(axis=1)
> array([  3.,   4.,   4., 100.])
>>> b.cumsum(axis=1) #对每一行的数组元素进行累加
>array([[  3. ,   5. ,   6. ],
       [  1. ,   5. ,   5.5],
       [  1. ,   4. ,   8. ],
       [  0. ,   0. , 100. ]])
>>> a.mean() #所有元素均值
>>> b.median() #中位数
>>> a.corrcoef() #相关系数
>>> np.std(b) #标准差

复制数组

>>> h = a.view() #创建数组视图
>>> np.copy(a) #复制一个array对象
>>> h = a.copy() 

数组元素排序

>b
array([[  3. ,   2. ,   1. ],
       [  1. ,   4. ,   0.5],
       [  1. ,   3. ,   4. ],
       [  0. ,   0. , 100. ]])
>>> b.sort() #数组排序(默认按行排序)
>array([[  1. ,   2. ,   3. ],
       [  0.5,   1. ,   4. ],
       [  1. ,   3. ,   4. ],
       [  0. ,   0. , 100. ]])
>>> b.sort(axis=0) #按列排序

数组切片,子集,索引

起始编号:终止编号(不含):步长

>a
>array([[1, 2, 3],
        [4, 5, 6]])
>b
>array([[  0. ,   0. ,   3. ],
        [  0.5,   1. ,   4. ],
        [  1. ,   2. ,   4. ],
        [  1. ,   3. , 100. ]])
子集Subsetting
>>> a[1] #选中数组a第2行所有元素
>>> b[1,2] #选中b数组第2行第3列的元素4.0(等价于b[1][2])
 
 切片Slicing
>>> b[0:2] #选中b数组第0行到第1行的所有元素
>array([[0. , 0. , 3. ],
       [0.5, 1. , 4. ]])
>>> b[0:2,2] #在第2列中选中第0行到第1行的元素
>array([3., 4.])


>>> b[:3] #选中0,1,2行所有元素  等价于b[0:1,:]
>array([[0. , 0. , 3. ],
       [0.5, 1. , 4. ],
       [1. , 2. , 4. ]])
>>> b[2,...] #选中第2行所有元素,等价于b[1,:,:]
>array([1., 2., 4.])
>>> b[::-1]#反转数组
 
布尔索引Boolean Indexing
>>> a[a>2] #选择a数组中所有比2大的数组元素组成向量
>array([3, 4, 5, 6])

花式索引Fancy Indexing
>>> b
>array([[  0. ,   0. ,   3. ],
       [  0.5,   1. ,   4. ],
       [  1. ,   2. ,   4. ],
       [  1. ,   3. , 100. ]])
>>> b[[1, 0, 1, 0],[0, 1, 2, 0]] #选中元素 (1,0),(0,1),(1,2) 和 (0,0)
>array([0.5, 0. , 4. , 0. ])

数组操作

ls = a.tolist()
#把ndarray对象a转换为列表
>>>b
>array([[  0. ,   0. ,   3. ],
       [  0.5,   1. ,   4. ],
       [  1. ,   2. ,   4. ],
       [  1. ,   3. , 100. ]])
转置矩阵Transposing Array
>>> np.transpose(b)
>>> b.T 
>array([[  0. ,   0.5,   1. ,   1. ],
       [  0. ,   1. ,   2. ,   3. ],
       [  3. ,   4. ,   4. , 100. ]])
 
 改变矩阵型Changing Array Shape
>>> b.ravel() #展平矩阵,使其变为一个向量
>array([  0. ,   0. ,   3. ,   0.5,   1. ,   4. ,   1. ,   2. ,   4. ,
         1. ,   3. , 100. ])
>>> b.reshape(3,-2) #重塑矩阵,但不改变矩阵数据,.resize会改变原数组
>array([[  0. ,   0. ,   3. ,   0.5],
       [  1. ,   4. ,   1. ,   2. ],
       [  4. ,   1. ,   3. , 100. ]])

增删矩阵元素 Adding/Removing Elements

>>> r = np.arange(20)
>array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
       17, 18, 19])
>>> r.resize((4,5))
>array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19]])
 >>>a
 > array([[1, 2, 3],
          [4, 5, 6]])
>>> np.append(r,b)
> array([  0. ,   1. ,   2. ,   3. ,   4. ,   5. ,   6. ,   7. ,   8. ,
         9. ,  10. ,  11. ,  12. ,  13. ,  14. ,  15. ,  16. ,  17. ,
        18. ,  19. ,   0. ,   0. ,   3. ,   0.5,   1. ,   4. ,   1. ,
         2. ,   4. ,   1. ,   3. , 100. ])

>>> np.insert(a, 1, 5) #在a矩阵的第1个元素位置插入5,并把a矩阵变为向量
>array([1, 5, 2, 3, 4, 5, 6])
>>> np.insert(a, (0,1), 5) #在a矩阵的第1个元素和第0个元素位置插入5,并把a矩阵变为向量
>array([5, 1, 5, 2, 3, 4, 5, 6])
>>> np.delete(a,[1]) #删除元素
>array([1, 3, 4, 5, 6])

Combining Arrays

>>> np.concatenate((r,b),axis=1) #按行串接矩阵,两矩阵行数必须相同,Note:axis=0是按列串接两矩阵,此时两矩阵列数一定要相同,否则出现ValueError
>array([[  0. ,   1. ,   2. ,   3. ,   4. ,   0. ,   0. ,   3. ],
        [  5. ,   6. ,   7. ,   8. ,   9. ,   0.5,   1. ,   4. ],
        [ 10. ,  11. ,  12. ,  13. ,  14. ,   1. ,   2. ,   4. ],
        [ 15. ,  16. ,  17. ,  18. ,  19. ,   1. ,   3. , 100. ]])
>>> np.vstack((a,b)) #垂直串接矩阵,矩阵列数一定要相同!!!
>array([[  1. ,   2. ,   3. ],
        [  4. ,   5. ,   6. ],
        [  0. ,   0. ,   3. ],
        [  0.5,   1. ,   4. ],
        [  1. ,   2. ,   4. ],
        [  1. ,   3. , 100. ]])
>>> np.r_[a, b] #垂直串接矩阵,矩阵列数一定要相同!!!(结果同上)

>>> np.hstack((e,f)) #水平串接矩阵,矩阵行数一定要相同!!!
>array([[  0. ,   1. ,   2. ,   3. ,   4. ,   0. ,   0. ,   3. ],
        [  5. ,   6. ,   7. ,   8. ,   9. ,   0.5,   1. ,   4. ],
        [ 10. ,  11. ,  12. ,  13. ,  14. ,   1. ,   2. ,   4. ],
        [ 15. ,  16. ,  17. ,  18. ,  19. ,   1. ,   3. , 100. ]])
>>> np.column_stack((a,d)) #水平串接矩阵(结果同上)
>>> np.c_[a,d] (结果同上)

分裂矩阵Splitting Arrays

>>> a
>array([[1, 2, 3],
        [4, 5, 6]])
>>> np.hsplit(a,3) #将a划分为三个列向量
>array([[1],[4]]), 
 array([[2],[5]]), 
 array([[3],[6]])]

>>> np.vsplit(b,4) #将b划分为四个行向量
>[array([[0., 0., 3.]]), array([[0.5, 1. , 4. ]]), array([[1., 2., 4.]]), array([[  1.,   3., 100.]])]

实例:

图像的数组表示
图像一般使用RGB色彩模式,即每个像素点由红、绿、蓝表示,是一个由像素组成的二维矩阵,每个元素是一个RGB值
R:范围0~255
G:范围0~255
B:范围0~255
PIL库:用于图像处理的第三方库

from PIL import Image
#image是PIL中一个代表图像的类
import numpy as np

im = np.array(Image.open("C:/Users/22905/Desktop/heyi.png"))
print(im.shape, im.dtype)
#图像是一个三位数组,维度分别为高度,宽度,像素的RGB值

#图像变换
b = [255,255,255]-a
#将作用与a中每一个像素的RGB值
im_1 = Image.fromarray(b.astype('unint8'))
#利用Image对象的fromarray方法把数组b转换为一个Image对象im_0
im_1.save("C:/Users/22905/Desktop/heyi_2.png")
#convert('L')方法可以把图像转换成灰度图

参考:

NumPy Cheat Sheet: Data Analysis in Python
The Data Scientist’s Toolbox Tutorial - 2
www.numpy.org
Python数据分析与展示

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