数据分析(二)

Numpy:Numeric Python

引言:要学好机器学习,先打好数据分析的基础,打好基础才能实现后面那些经验的功能

一、导入

导入:import numpy as np

查看版本:np.__ version __

二、数组ndarray

1、使用np.array()

import numpy as np
test=np.array([1,2,3,4,5])
test

2、创建多维数组

2.1 数组创建函数

1.指定数值创建数组

np.eye(N=几行(默认列数和行数相等),dtype=数据类型)

np.ones(shape=形状,dtype=数据类型) 按照shape创建数组,用1填充

np.zeros(shape=形状,dtype=数据类型) 按照shape创建数组,用0填充

np.full(shape=形状,fill_value=数组的值,dtype=数据类型) 按照shape创建数组,用fill_value填充

2.指定范围创建数组

np.arange(start=起始值,stop=终止值,step=步长值) np.arange(1,5,1) [1,2,3,4]

np.linspace(start=起始值,stop=终止值,num=分多少份儿)

np.logspace(start=起始值,stop=终止值,num=分多少份儿)

2.2 创建随机样本

1、简单随机数

np.random.randint(low=下界,high=上届,size=形状)

np.random.randn(d0,d1,d2…dn) 创建一个n维数组,值用标准正态分布的随机数填充

np.random.random(size=形状) 按照size创建数组,值用以loc为中心scale为范围的正态分布的随机数填充

2、分布

NumPy

二、ndarray的属性

4个必记参数:

ndim:维度 shape:形状(各维度的长度) size:总长度 dtype:元素类型

三、ndarray的基本操作

1、索引

基本索引:一维与列表完全一致 多维同理

import numpy as np
#0-10之间的随机整数   填充提供矩阵
ndarr=np.random.randint(0,10,size=5)
ndarr #array([0,4,6,9,8])
ndarr[0]
ndarr[1]
ndarr[-1]  #8

ndarr=np.random.randint(0,10,size=(4,5))
ndarr
#array([[7, 0, 9, 4, 8],[7, 6, 0, 7, 4],[2, 3, 4, 5, 2],[1, 1, 6, 8, 1]])
ndarr[0][0]
ndarr[-1][-2]#8

高级索引:整数数组形式的索引

nd=np.random.randint(0,10,size=(5,6))
nd
#array([[0, 4, 7, 5, 9, 7],[5, 3, 2, 9, 5, 5],[9, 2, 6, 2, 7, 7],[0, 3, 5, 4, 3, 9],[9, 1, 9, 7, 1, 3]])
nd[0][0]#普通的索引
#整数数组的索引
nd[0,0]
nd[-1,0]
nd[-1,]
#往里一个维度,要同时取出0 2 4
nd[-1,[0,2,4]]
nd[-1,[4,2,0]]#顺序任意 可以正向取,也可以反向取,还可以随意取,而且可以重复取
nd[-1,[2,4,0]]
nd[-1,[2,4,0,0,0,0]]#array([3,3])
#nd[[1,1],1]

#list
list1 = [[0, 4, 7, 5, 9, 7],[5, 3, 2, 9, 5, 5],[9, 2, 6, 2, 7, 7],[0, 3, 5, 4, 3, 9],[9, 1, 9, 7, 1, 3]]
list1
#[[0, 4, 7, 5, 9, 7],[5, 3, 2, 9, 5, 5],[9, 2, 6, 2, 7, 7],[0, 3, 5, 4, 3, 9],[9, 1, 9, 7, 1, 3]]
list1[0][0]#0
list1[0,0]

练习:使用数组索引寻找指定位置的值

nd[0,0,0,0]
nd[0,0,0,-2]
nd[0,3,1,-1]
nd = np.random.randint(0,10,size=(5,4,3,7))  # 这是一个四维数组 里面有5个元素 里面有4个元素 里面有3个元素 里面有7个元素
nd

2、切片

一维与列表切片完全一致 多维时同理

ndarr = np.random.randint(0,10,size=5)
ndarr  #array([8, 6, 5, 3, 6]
ndarr[1:4]
ndarr[0:4]
ndarr[:4]
ndarr[:]  #array([8, 6, 5, 3, 6]

一个:的形式进行切片

ndarr = np.random.randint(0,10,size=(4,5))
ndarr 
#array([[9, 0, 4, 7, 0],[1, 0, 4, 5, 6],[7, 4, 6, 8, 3],[0, 1, 0, 8, 0]])
ndarr[:2]
# 切片也是 从外往里 一级一级切
ndarr[:,0:2]
ndarr[1:3,1:4]
ndarr[1:3,1:-1]  #array([[0, 4, 5],[4, 6, 8]])

练习取项上人头

import matplotlib.pyplot as plt
jin = plt.imread('../backup/data/jin.png')
jin
plt.imshow(jin)
jin.shape  #(273, 411, 3)
plt.imshow(jin[25:140,170:260])

两个::的形式进行切片和翻转

nd = np.random.randint(0,10,size=9)
nd  #array([0, 0, 4, 9, 0, 3, 8, 6, 5])
nd[1:-1:2]  # start:stop:step
nd[::-1]
nd[::-2]  #array([5, 8, 0, 4, 0])
nd = np.random.randint(0,10,size=(5,5))
nd
#array([[2, 5, 6, 6, 3],[3, 8, 5, 8, 1],[4, 5, 3, 4, 6],[5, 8, 3, 3, 9],[4, 6, 0, 1, 6]])
nd[::2]
nd[:,::2]
nd[::2,::2]
nd[::-1]
#array([[2, 6, 3],[4, 3, 6],[4, 0, 6]])

练习:图片的上下颠倒 左右颠倒 中心旋转 变瘦 色值的交换(蓝精灵 绿巨人)

plt.imshow(jin)  #正常图片
jin.shape  #(273, 411, 3) 
plt.imshow(jin[::-1])  #上下颠倒
plt.imshow(jin[:,::-1])#左右颠倒 
plt.imshow(jin)
plt.imshow(jin[::-1,::-1])#中心旋转
# r g b
# r g b
plt.imshow(jin[::-1,::-1,::-1])#蓝精灵
plt.imshow(jin[:,:,:])
# r g b
# g r b
# plt.imshow(jin[:,:,[0,1,2]])
plt.imshow(jin[:,:,[1,0,2]])#绿巨人
plt.imshow(jin[::20,::20])#马赛克

部分马赛克

jin2 = jin.copy()
plt.imshow(jin2)
jin[25:125:5,160:260:5]
for i in range(100):
    for j in range(100):
        jin2[i+25,j+160] = jin[25:125:5,160:260:5][i//5,j//5]
plt.imshow(jin2)

3、变形

使用reshape的函数,注意参数是一个tuple!

nd = np.random.randint(0,10,size=(4,5))  
nd  #array([[2, 5, 0, 9, 6],[0, 1, 3, 3, 8],[5, 3, 9, 7, 8],[6, 0, 9, 8, 8]])
nd.size  #20
nd.reshape((5,4))  # 形状可以任意改变 但是size不能变化
nd.reshape((10,2))
nd.reshape((2,10))
# nd.reshape((5,5))  # 25
nd.reshape((20,1))
nd.reshape((-1,1))  # -1指的是自动计算的意思
nd.reshape((1,20))
nd.reshape((1,-1))#array([[2, 5, 0, 9, 6, 0, 1, 3, 3, 8, 5, 3, 9, 7, 8, 6, 0, 9, 8, 8]])

4、连结

np.concatenate()

连结需要注意的点:

连结的参数是列表:一定要加小括号

必须维度相同 形状相符

连结的方向默认是shape这个tuple的第一个值所代表的维度方向

可通过axis参数改变连结的方向

nd   #array([[2, 5, 0, 9, 6],[0, 1, 3, 3, 8],[5, 3, 9, 7, 8],[6, 0, 9, 8, 8]])
# 第一个参数 以元组的形式 传入要拼接的多个ndarr
np.concatenate((nd,nd))  # 默认按照纵向拼接
# 第二个参数 axis 用来指定 拼接方向
# np.concatenate((nd,nd),axis=0)
# np.concatenate((nd,nd),axis=1)
# np.concatenate((nd,nd),axis=-1)  # -1是最里层
np.concatenate((nd,nd),axis=-2)  #array([[2, 5, 0, 9, 6],[0, 1, 3, 3, 8],[5, 3, 9, 7, 8],[6, 0, 9, 8, 8],[2, 5, 0, 9, 6],[0, 1, 3, 3, 8], [5, 3, 9, 7, 8],[6, 0, 9, 8, 8]])

5、切分

与级联类似,三个函数完成切分工作:

np.split

np.vsplit

np.hsplit

# ary, indices_or_sections, axis=0
# ary 要切分的数组
# indices_or_sections 用来指定 分成几份 或者 从哪里分
# axis 用来指定切分的方向
np.split()
nd = np.random.randint(0,10,size=(4,4))
nd  #array([[2, 5, 2, 5],[8, 8, 8, 0],[1, 4, 8, 0],[5, 5, 1, 8]])
# np.split(nd,2)  # 按照 axis0 把ndarr分成了2份
np.split(nd,2,axis=1)
#[array([[2, 5],[8, 8],[1, 4],[5, 5]]), array([[2, 5],[8, 0],[8, 0],[1, 8]])]
np.vsplit(nd,2)
#[array([[2, 5, 2, 5],[8, 8, 8, 0]]), array([[1, 4, 8, 0],[5, 5, 1, 8]])]
np.hsplit(nd,2)
nd #array([[2, 5, 2, 5],[8, 8, 8, 0],[1, 4, 8, 0],[5, 5, 1, 8]])
# np.split(nd,2,axis=0)  # 传入一个整数指的是 分成几份
np.split(nd,[2, 3],axis=0)  # 传入一个列表 可以指定在什么位置切割
#[array([[2, 5, 2, 5],[8, 8, 8, 0]]), array([[1, 4, 8, 0]]), array([[5, 5, 1, 8]])]

6、副本

所有赋值运算不会为ndarray的任何元素创建副本。对赋值后的对象操作也会影响原数组。

nd
#array([[2, 5, 2, 5],[8, 8, 8, 0],[1, 4, 8, 0],[5, 5, 1, 8]])
nd1 = nd  # 对象的复制都是浅层复制
nd1[0,0] = 100
nd1  #array([[100,   5,   2,   5],[  8,   8,   8,   0],[  1,   4,   8,   0], [  5,   5,   1,   8]])
nd  #array([[100,   5,   2,   5],[  8,   8,   8,   0],[  1,   4,   8,   0],[  5,   5,   1,   8]])

可使用copy()函数创建副本

# 对于ndarray对象 凡是涉及到复制后改变 又不希望影响原数组的 都用copy (这是最保险的)
nd2 = nd.copy()  # 深层copy
nd2
# array([[100,   5,   2,   5],[  8,   8,   8,   0],[  1,   4,   8,   0],[  5,   5,   1,   8]])
# 对于列表 使用切片 也是深层复制
nd3 = nd[:]
nd3
nd3[0,0] = 300
nd3
nd

四、ndarray的聚合操作

1、求和np.sum

2、最大值最小值:np.max/np.min

3、其他聚合操作

Function Name    NaN-safe Version    Description
np.sum    np.nansum    Compute sum of elements 所有元素的和
np.prod    np.nanprod    Compute product of elements 所有元素的乘积
np.mean    np.nanmean    Compute mean of elements
np.std    np.nanstd    Compute standard deviation
np.min    np.nanmin    Find minimum value
np.max    np.nanmax    Find maximum value
np.argmin    np.nanargmin    Find index of minimum value
np.argmax    np.nanargmax    Find index of maximum value
np.any    N/A    Evaluate whether any elements are true
np.all    N/A    Evaluate whether all elements are true

示例 nd = np.random.randint(0,10,size=(3,3))

nd = np.random.randint(0,10,size=(3,3))
nd
#array([[9, 2, 2],[7, 7, 0],[1, 4, 6]])
np.sum(nd)  # 默认是对所有元素进行求和
# axis用来控制 求和的方向
np.sum(nd,axis=0)  # 竖直方向求和
np.sum(nd,axis=1)  # 水平方向求和
np.sum(nd,axis=-1)
#array([13, 14, 11])
np.prod(nd,axis=0)  #array([63, 56,  0])
nd  #array([[9, 2, 2],[7, 7, 0],[1, 4, 6]])
# 只要有ture就返回true
# np.any(nd)
np.any(nd,axis=0)  #array([ True,  True,  True])
# 是否都是True
np.all(nd)
np.all(nd,axis=0)
np.all(nd,axis=1)#array([ True, False,  True])
[1,2,3]*5  #[1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3]
np.array([1,2,3])  #array([1, 2, 3])
# 0 1 2 3 4
# -1 -2 -3
axis=-1

np.argwhere
nd
# array([[9, 2, 2], [7, 7, 0], [1, 4, 6]])
nd==9
# array([[ True, False, False],[False, False, False],[False, False, False]])
nd>6
#array([[ True, False, False],[ True,  True, False],[False, False, False]])
# 使用argwhere 可以按照值去找 元素的索引
np.argwhere(nd==9)
np.argwhere(nd==1)
np.argwhere(nd>6)
# argwhere本身是用来找 值不是0的元素的索引的
# array([[0, 0], [1, 0], [1, 1]], dtype=int64)

np.sum 和 np.nansum 的区别 nan not a number

# NaN not a number
ndarr = np.array([1,2,3,np.nan])
ndarr
# array([ 1.,  2.,  3., nan])
np.sum(ndarr)
#nan
# np.nansum(ndarr)
np.nanprod(ndarr) #6.0
nd2 = np.random.randint(0,10,size=(2,2,2))
nd2
# array([[[3, 8],[1, 9]],[[0, 0],[0, 4]]])
np.concatenate((nd2,nd2),axis=2)
# array([[[3, 8, 3, 8],[1, 9, 1, 9]],[[0, 0, 0, 0],[0, 4, 0, 4]]]) 

五、ndarray的矩阵操作

1.基本矩阵操作

1)、算术运算符

加减乘除

ndarr=np.random.randint(0,10,size=(4,5))
nndarr
# array([[4, 5, 8, 3, 0],[9, 4, 4, 1, 5],[9, 6, 4, 0, 1],[6, 1, 6, 4, 9]])
ndarr+1
ndarr-1
ndarr*2
# array([[ 8, 10, 16,  6,  0],[18,  8,  8,  2, 10],[18, 12,  8,  0,  2],[12,  2, 12,  8, 18]])
  1. 矩阵积np.dot()

    ndarr

    array([[4, 5, 8, 3, 0],[9, 4, 4, 1, 5],[9, 6, 4, 0, 1],[6, 1, 6, 4, 9]])

    ndarr.shape

    矩阵的点积# A矩阵 和 B矩阵 做点积

    A矩阵是m行n列的矩阵# B矩阵是i行j列的矩阵

    B的行数必须得等于A的列数 i要等于n# 结果是一个 m行 j列的一个矩阵

    ndarr2 = np.random.randint(0,10,size=(5,2))
    ndarr2

    array([[4, 4],[0, 9],[0, 8],[1, 5],[6, 2]])

    np.dot(ndarr,ndarr2)
    #array([[ 19, 140],[ 67, 119],[ 42, 124],[ 82, 119]])
    nd1 = np.random.randint(0,5,size=(2,3))
    nd1
    #array([[1, 2, 3],[2, 0, 4]])
    nd2 = np.random.randint(0,5,size=(3,1))
    nd2

    array([[4],[3],[0]])

    np.dot(nd1,nd2)

    array([[10],[ 8]])

    对应位置 相乘然后相加 放回对应位置

2.广播机制

例1: m = np.ones((2, 3)) a = np.arange(1,4,1) 求 m + a

m = np.ones((2, 3))
m  #array([[1., 1., 1.],[1., 1., 1.]])
a = np.arange(1,4,1) 
a   #array([1, 2, 3])
m + a  #array([[2., 3., 4.],[2., 3., 4.]])

例2: a = np.arange(3).reshape((3, 1)) b = np.arange(3) 求 a + b

a = np.arange(3).reshape((3, 1)) 
a # array([[0],[1],[2]])
b = np.arange(3)
b	# array([0, 1, 2])
a + b  # array([[0, 1, 2],[1, 2, 3],[2, 3, 4]])

六、ndarray的排序

1.快速排序

  1. 快速排序

np.sort()与ndarray.sort()都可以,但有区别:

  • np.sort(ndarray) 不改变输入
  • ndarray.sort() 本地处理,不占用空间,但改变输入

示例 nd = np.random.randint(0,100,size=15)

ndarr = np.random.randint(0,100,size=15)
ndarr  #array([90, 86, 55, 97, 60, 36,  9, 41, 55, 71,  2, 94, 31, 59, 63])
# 可以使用 np模块带有的 sort方法 返回排序后的数组 (不影响原来数组的顺序)
np.sort(ndarr)
# array([ 2,  9, 31, 36, 41, 55, 55, 59, 60, 63, 71, 86, 90, 94, 97])
# 多维数组对象 自身也带有 排序的方法
ndarr.sort()
ndarr
#array([ 2,  9, 31, 36, 41, 55, 55, 59, 60, 63, 71, 86, 90, 94, 97])

2.部分排序

np.partition(a,k)

有的时候我们不是对全部数据感兴趣,我们可能只对最小或最大的一部分感兴趣。

  • 当k为正时,我们想要得到最小的k个数
  • 当k为负时,我们想要得到最大的k个数

示例 nd = np.random.randint(0,100,size=15)

ndarr = np.random.randint(0,100,size=15)
ndarr
#array([83, 57, 43, 83, 95, 73, 95,  7, 46, 26, 86, 47, 59, 45, 64])
# 10个数据库 里面分别有10000商品
# 计算销量最大的前三个
# a, kth a是要排序的数组 kth是要找最大的几个
# np.partition(ndarr,3)  # k是3 表示寻找 最小的3个
# np.partition(ndarr,5)  # 顺序可能是没有排好的 但是最前面的5个一定是最小的5个
np.partition(ndarr,-5)
np.partition(ndarr,-4)
#array([46,  7, 43, 45, 59, 47, 26, 57, 64, 73, 83, 83, 95, 86, 95])

猜你喜欢

转载自blog.csdn.net/m0_37906230/article/details/84072943