莫烦PYTHON | Numpy and Pandas教程

(未完)

第一章 Numpy & Pandas 简介

1.1 Why Numpy & Pandas?

采用矩阵运算,运算速度快,占用资源少,比python自带的字典或者列表要快很多;numpy是采用C语言编写的,而pandas又是基于numpy编写的升级版。

1.2 Numpy 和 Pandas 安装

sudo apt-get install python-numpy
sudo apt-get install python-pandas

第二章 Numpy 学习

2.1 Numpy 属性

array 数组:可生成数组或矩阵
ndim
shape
size

import numpy as np

array = np.array([[1,2,3],[4,5,6]])

print(array)
print(array.ndim) #维度dimenion:几维 2
print(array.shape) #形状:行数和列数 (23print(array.size) #元素个数 6

2.2 Numpy 的创建 array

array
dtype
zeros
ones
empty
arange
linspace

import numpy as np

a = np.array([[1,2,3],
             [4,5,6]])
print(a)

a = np.array([[1,2,3],[4,5,6]],dtype=np.int) #制定数据的类型 对于array,是dtype,而numpy的常用数据类型有两种:int和float,一般有int16 int32 int64,float同样,数值越大占用内存越大,精度也就越高,但是单位内存下存储的东西也就越少
print(a.dtype) #python3.5及以下版本默认类型为64,python3.6默认为32

a = np.zeros((3,4)) #生成3行4列元素全为0的矩阵
print(a) 

a = np.ones((3,4),dtpye = np.float32) #生成3行4列元素全为1的矩阵,并规定数据类型为float32
print(a)
print(a.dtype)

a = np.empty((3,4)) #生成3行4列且每个元素都接近0的矩阵,据说在python3.6中和zeros是一样的了,未查证
print(a)

#生成等差数列的两个方法:
a = np.arange(10,20,2) #生成连续的数组,从10到20(不包括20),**步长为2**
print(a)
a = np.linspace(10,20,5) #创建线段型数据 从10到20(包括20),**元素个数为5** 
print(a)
a = np.linspace(10,20,num=50, endpoint=True, retstep=False, dtype=None) 
print(a)

a = np.linspace(1,10,5).reshape((5,4)) #改变矩阵的形状,变为5行4列的矩阵
print(a)

函数arange()与linspace()的区别

np.arange(start,stop,step)
生成一个[start,stop) 左闭右开步长为step的一维数组。

np.linspace(start,stop,num=40, endpoint=True, retstep=False, dtype=None)
生成一个[start,stop]左右均闭的等差数列,元素个数num默认为50个,endpoint=True默认包含stop, retstep=False默认不显示步长, dtype=None默认不改变数据类型。

2.3 Numpy 基础运算1

import numpy as np
a = np.array([5,2,4,6])
b = np.arange(4) # = np.array([0,1,2,3])

#常规运算
c = a - b #[5,1,2,3]
c = a + b
c = a * b #[0,2,8,18] 对应位置上的元素相乘,并非矩阵乘法
c = a ** 2 #a^2 [25,4,16,36]
c = np.sin(a) #对每个元素求sin
c = 10*np.sin(a)

#逻辑判断,返回一个bool类型的矩阵
print(b<4) #[True,True,True,True]
print(a==2) #[False,True,False,False]
#----------------------------------------------------------------

#上面的运算都是基于一维矩阵/向量/一维数组,现在要对多维矩阵进行运算
a = np.array([[1,1],
              [0,1]]) #2行2列的矩阵
b = np.arange(4).reshape((2,2))

c_dot = np.dot(a,b) #矩阵相乘
c_dot_2 = a.dot(b) #两种方法等价
#-------------------------------------------------------------
a = np.random.random((2,4)) #生成一个所有元素都是0到1的2行4列的随机数矩阵
print(a)
# array([[ 0.94692159,  0.20821798,  0.35339414,  0.2805278 ],
#       [ 0.04836775,  0.04023552,  0.44091941,  0.21665268]])

np.sum(a) #矩阵中所有元素求和
np.min(a) #矩阵中最小值
np.max(a) #矩阵中最大值

#分别计算每一行或者每一列的运算,用到axis=1,0;其中0表示按列,1表示按行
np.sum(a,axis=1)
# sum = [ 1.96877324  2.43558896]
np.min(a,axis=0)
# min = [ 0.23651224  0.41900661  0.36603285  0.46456022]
np.max(a,axis=1)
# max = [ 0.84869417  0.9043845 ]

2.4 Numpy 基础运算2

argmax : argument of the maximum

import numpy as np
A = np.arange(2,14).reshape((3,4))
# array([[ 2, 3, 4, 5]
#        [ 6, 7, 8, 9]
#        [10,11,12,13]])

print(np.argmin(A)) #求矩阵中最小元素的索引,第一个元素记为位置0,最后一个元素对应位置为11   
# 0
print(np.argmax(A))    
# 11

#求平均值 下面四种方法等价:
print(np.mean(A))
print(A.mean())
print(np.median(A))
print(np.average(A))
#7.5

print(np.cumsum(A)) #累加函数,生成的每一项矩阵元素均是从原矩阵首项累加到对应项的元素之和,得到1*12的矩阵
# [2 5 9 14 20 27 35 44 54 65 77 90]
print(np.diff(A)) #累差函数,后一项与此项的差作为这一项的元素,得到3*3的矩阵
# [[1 1 1]
#  [1 1 1]
#  [1 1 1]]

print(np.nonzero(A)) #查找哪些位置上的元素非0,结果显示成行与列,一一对应   
#(array([0,0,0,0,1,1,1,1,2,2,2,2]),array([0,1,2,3,0,1,2,3,0,1,2,3]))
A = np.array([[0,1,2],[6,0,8],[9,5,0]])
print(np.nonzero(A))
#(array([0,0,1,1,2,2]),array([1,2,0,2,0,1])) 见下图

A = np.arange(14,2, -1).reshape((3,4)) 
# array([[14, 13, 12, 11],
#       [10,  9,  8,  7],
#       [ 6,  5,  4,  3]])

print(np.sort(A)) #行排序,从小到大   
# array([[11,12,13,14]
#        [ 7, 8, 9,10]
#        [ 3, 4, 5, 6]])

#转置,两种方法等价(A必须是矩阵/一维向量,不能是数组/序列)
print(np.transpose(A))    
print(A.T)
# array([[14,10, 6]
#        [13, 9, 5]
#        [12, 8, 4]
#        [11, 7, 3]])
# array([[14,10, 6]
#        [13, 9, 5]
#        [12, 8, 4]
#        [11, 7, 3]])

#clip(array,a,b)函数,其中规定a<b,使矩阵中<a的元素全部变为a,>b的元素全部变为b
print(A)
# array([[14,13,12,11]
#        [10, 9, 8, 7]
#        [ 6, 5, 4, 3]])
print(np.clip(A,5,9))    
# array([[ 9, 9, 9, 9]
#        [ 9, 9, 8, 7]
#        [ 6, 5, 5, 5]])

这里写图片描述

2.5 Numpy 索引

一维索引

在python的数组和列表中,可以使用a[1]这种方式索引,Numpy中也有类似方法:

import numpy as np
A = np.arange(3,15)
# array([3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])        
print(A[3])    # 6
#-----------------------------------------
A = np.arange(3,15).reshape((3,4))
"""
array([[ 3,  4,  5,  6]
       [ 7,  8,  9, 10]
       [11, 12, 13, 14]])
"""

print(A[0])   #索引第0行      
# [3 4 5 6]

二维索引

A = np.arange(3,15).reshape((3,4))
"""
array([[ 3,  4,  5,  6]
       [ 7,  8,  9, 10]
       [11, 12, 13, 14]])
"""
print(A[0][0])      # 3
print(A[0, 0])      # 3
print(A[1, 1:3])    # [8 9] 同python中的切片
#----------------------------------------------

for row in A:
    print(row)
"""    
[ 3,  4,  5, 6]
[ 7,  8,  9, 10]
[11, 12, 13, 14]   #使用for循环,遍历成行向量
"""

for column in A.T: #转置
    print(column)
"""  
[ 3,  7,  11]
[ 4,  8,  12]
[ 5,  9,  13]
[ 6, 10,  14]   #列向量
"""

迭代输出

import numpy as np
A = np.arange(3,15).reshape((3,4))
"""
array([[ 3,  4,  5,  6]
       [ 7,  8,  9, 10]
       [11, 12, 13, 14]])
"""    

print(A.flatten())   #flatten是展开函数,将多维矩阵按行列顺序展开成1行的数列
# array([3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])

for item in A.flat:  #flat是一个迭代器,本身是一个object属性
    print(item)

# 3
# 4
……
# 14

2.6 Numpy array 合并

np.vstack() 上下合并/垂直合并

import numpy as np
A = np.array([1,1,1])
B = np.array([2,2,2])

print(np.vstack((A,B)))    # vertical stack
"""
[[1,1,1]
 [2,2,2]]
"""

C = np.vstack((A,B))      
print(A.shape,C.shape)
# (3,) (2,3) A是一个数组,C是一个2行3列的矩阵

np.hstack() 左右合并/水平合并

D = np.hstack((A,B))       # horizontal stack
print(D)
# [1,1,1,2,2,2]

print(A.shape,D.shape)
# (3,) (6,) 都是一维数组/序列

np.newaxis()

前两节提到的转置操作,前提A必须是个矩阵/向量,但是如果我们生成了一个序列/数组,我们就要使用下面你这种方法了:

print(A[np.newaxis,:]) #冒号在前按列,冒号在后按行
# [[1 1 1]]

print(A[np.newaxis,:].shape) 
# (1,3) 是一个矩阵/向量

print(A[:,np.newaxis])
"""
[[1]
[1]
[1]]
"""

print(A[:,np.newaxis].shape)
# (3,1)

举个例子:

import numpy as np
A = np.array([1,1,1])[:,np.newaxis] #使用array生成数组,然后使用newaxis转换成矩阵
B = np.array([2,2,2])[:,np.newaxis]

C = np.vstack((A,B))   # vertical stack
D = np.hstack((A,B))   # horizontal stack

print(D)
"""
[[1 2]
[1 2]
[1 2]]
"""

print(A.shape,D.shape)
# (3,1) (3,2)

np.concatenate() 多个矩阵的合并

C = np.concatenate((A,B,B,A),axis=0) #0按列合并 1按行合并

print(C)
"""
array([[1],
       [1],
       [1],
       [2],
       [2],
       [2],
       [2],
       [2],
       [2],
       [1],
       [1],
       [1]])
"""

D = np.concatenate((A,B,B,A),axis=1)

print(D)
"""
array([[1, 2, 2, 1],
       [1, 2, 2, 1],
       [1, 2, 2, 1]])
"""

2.7 Numpy array 分割

np.split(A, 2, axis=1) #分成2份,保留行数
np.split(A, 2, axis=0) #保留列数
np.hsplit(A, 3) #保留行数
np.vsplit(A, 3) #保留列数
np.array_split(A, 3, axis=1) #分成3份,保留行数

import numpy as np

A = np.arange(12).reshape((3, 4))
print(A)
"""
array([[ 0,  1,  2,  3],
    [ 4,  5,  6,  7],
    [ 8,  9, 10, 11]])
"""

print(np.split(A, 2, axis=1)) #0保留列数 1保留行数
"""
[array([[0, 1],
        [4, 5],
        [8, 9]]), array([[ 2,  3],
        [ 6,  7],
        [10, 11]])]
"""

print(np.split(A, 3, axis=0))
# [array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8,  9, 10, 11]])]
#--------------------------------------------------------------

print(np.vsplit(A, 3)) #等于 print(np.split(A, 3, axis=0))

# [array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8,  9, 10, 11]])]


print(np.hsplit(A, 2)) #等于 print(np.split(A, 2, axis=1))
"""
[array([[0, 1],
       [4, 5],
       [8, 9]]), array([[ 2,  3],
        [ 6,  7],
        [10, 11]])]
"""
#------------------------------------------------------------

print(np.split(A, 3, axis=1)) #不等量划分会报错
# ValueError: array split does not result in an equal division

#不等量分割
print(np.array_split(A, 3, axis=1)) 
"""
[array([[0, 1],
        [4, 5],
        [8, 9]]), array([[ 2],
        [ 6],
        [10]]), array([[ 3],
        [ 7],
        [11]])]
"""

2.8 Numpy copy & deep copy

= 的赋值方式带有关联性

import numpy as np

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

b = a
c = a
d = b

a[0] = 11 #改变a
print(a)
# array([11,  1,  2,  3])

b is a  # True #b c d也会改变
c is a  # True
d is a  # True

d[1:3] = [22, 33]   # array([11, 22, 33,  3])
print(a)            # array([11, 22, 33,  3])
print(b)            # array([11, 22, 33,  3])
print(c)            # array([11, 22, 33,  3])

copy() 的赋值方式没有关联性

b = a.copy()    # deep copy
print(b)        # array([11, 22, 33,  3])
a[3] = 44
print(a)        # array([11, 22, 33, 44])
print(b)        # array([11, 22, 33,  3]) #b不会随着a的改变而改变

第三章 Pandas 学习

3.1 Pandas 基本介绍

3.2 Pandas 选择数据

3.3 Pandas 设置值

3.4 Pandas 处理丢失数据

3.5 Pandas 导入导出

3.6 Pandas 合并 concat

3.7 Pandas 合并 merge

3.8 Pandas plot 出图

第四章 附加内容

4.1 为什么用 Numpy 还是慢,你用对了吗?

猜你喜欢

转载自blog.csdn.net/kudou1994/article/details/80936913