numpy学习笔记

Numpy & Pandas
最近在看吴恩达机器学习以及机器学习实战,在做课后习题的过程中对numpy以及pandas的操作很不熟练,所以看了莫烦的numpy和pandas的教程,查阅了一些资料,做对numpy学习做了一些记录

numpy

numpy属性

numpy基本用法

import numpy as np
array = np.array([[1,2,3],[2,3,4]])个列表转换为矩阵num
print(array,array.ndim,array.shape,array.size)
#ndim 是维度,即shape返回元组中的元素数量
#shape 它是一个元组,返回各个维度的维数。
#size 返回矩阵大小

array和matrix区别

在学习numpy发现很多博客对matrix和array的使用都没有特殊的说明,实际上matrix是array的分支,matrix和array在很多时候都是通用的,你用哪一个都一样。但这时候,官方建议大家如果两个可以通用,那就选择array,因为array更灵活,速度更快,很多人把二维的array也翻译成矩阵。
但是matrix的优势就是相对简单的运算符号,比如两个矩阵相乘,就是用符号*,但是array相乘不能这么用,得用方法.dot()
array的优势就是不仅仅表示二维,还能表示3、4、5...维,而且在大部分Python程序里,array也是更常用的。

numpy基础运算

一维简单运算

import numpy as np
a = np.array([10,20,30,40])
b =np.arange(4,8)#返回一个有终点和起点的固定步长的排列,可以有三个属性,可以理解为(起点,终点,步长)
print(a,b)#[10 20 30 40] [4 5 6 7]

#常规运算
c=a+b#[14 25 36 47]
c=a-b#[ 6 15 24 33]
c=a*b#对应位置相乘
c=b**2# b^2  [16 25 36 49]
c=10*np.sin(a)#numpy自带求sin方法
print(c)

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

多维矩阵运算

import numpy as np
a = np.array([[1,1],
              [0,1]]) #2行2列的矩阵
b = np.arange(4).reshape((2,2))
#reshape()方法用于改变数组的形状(数组的形状会改变,但是数组中的值不会改变)
c_dot = np.dot(a,b) #矩阵相乘
c_dot_2 = a.dot(b) #两种方法等价



a = np.random.random((2,4)) #生成一个所有元素都是0到1的2行4列的随机数矩阵
print(a)
#[[0.62385337 0.99577629 0.555187   0.24056486][0.70766872 0.7260784  0.8494034  0.16935143]]

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

#分别计算每一行或者每一列的运算,用到axis=1,0;其中0表示按列,1表示按行
np.sum(a,axis=1)
# sum =[2.41538151 2.45250196]
np.min(a,axis=0)
# min = [0.62385337 0.7260784  0.555187   0.16935143]
np.max(a,axis=1)
# max = [0.99577629 0.8494034 ]

numpy中其他一些常用运算

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

    print(np.argmin(A))#输出 0 输出最小值的索引
    print(np.argmax(A))#输出 11 输出最大值的索引
    print(np.argmax(A,axis=1))# 输出[3 3 3] axis=1代表横向 每一行的最大值索引
    print(np.argmax(A,axis=0))# [2 2 2 2] axis=0 代表纵向 每一列的最大值索引
    
  • 求平均值

    print(np.mean(A))
    print(A.mean())
    print(np.average(A))
    print(np.median(A))#求中位数
    

    mean和average都是计算均值的函数,在不指定权重的时候average和mean是一样的。指定权重后,average可以计算一维的加权平均值。具体如下:

    import numpy as np
    b = np.array([1, 2, 3, 4])
    wts = np.array([4, 3, 2, 1])
    print( np.average(b)#2.5
    print(np.mean(b)#2.5
    print( np.average(b, weights=wts))# 设置了权重weight 输出2.0
    
  • 累加和累差

    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]]
    """"
    
  • nonzero()

    返回非零元素索引的元组 元组中的数组数量取决于矩阵维度

    print(np.nonzero(A)) #查找哪些位置上的元素非0,结果显示成行与列,一一对应   
    #(array([0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2], dtype=int64), array([0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3], dtype=int64))
    A = np.array([[0,1,2],[6,0,8],[9,5,0]])
    print(np.nonzero(A))
    #(array([0, 0, 1, 1, 2, 2], dtype=int64), array([1, 2, 0, 2, 0, 1], dtype=int64))
    print(np.transpose(np.nonzero(A)))#改变序列 对于二维数组来说 transpose就是输出转置矩阵 
    """
    [[0 1]
    [0 2]
    [1 0]
    [1 2]
    [2 0]
    [2 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]])
    
  • 转置

    print(np.transpose(A))    
    print(A.T)
    
  • clip()

    clip(array,a,b)是一个截断函数,也就是将指定数组或数值的大小限制在你规定的范围[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]])
    """"
    

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循环,遍历成行向量
for row in A:
    print(row)
"""    
[ 3,  4,  5, 6]
[ 7,  8,  9, 10]
[11, 12, 13, 14]   
"""
#使用for循环A的转置,即遍历成列向量
for column in A.T: #转置
    print(column)
"""  
[ 3,  7,  11]
[ 4,  8,  12]
[ 5,  9,  13]
[ 6, 10,  14]   
"""

迭代输出flatten()函数 & flat函数

flatten()函数将数组的副本转换为一个维度,并返回

flat函数返回的是一个迭代器,可以用for访问数组每一个元素

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

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))      
print(D)
# [1,1,1,2,2,2]
print(A.shape,D.shape)
# (3,) (6,) 都是一维数组/序列

np.stack()

stack()函数的原型是numpy.stack(arrays, axis=0),即将一堆数组的数据按照指定的维度进行堆叠。

A = np.array([1,2,3])
B = np.array([2,3,4])
np.stack([A,B],axis=0)
"""
array([[1, 2, 3],
       [2, 3, 4]])
"""
np.stack([A,B],axis=1)
"""
array([[1, 2],
       [2, 3],
       [3, 4]])
"""
#换成二维数组的情况下
A = np.array([[1,2,3]])
B = np.array([[2,3,4]])
np.stack([A,B],axis=0)
"""
array([[[1, 2, 3]],
       [[2, 3, 4]]])
"""
#进行stack的两个数组必须有相同的形状,同时,输出的结果的维度是比输入的数组都要多一维的。

np.newaxis()

np.newaxis的作用就是选取部分的数据增加一个维度

A = np.array([1,1,1])
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)

np.concatenate()

np.concatenate()函数能够一次完成多个数组的拼接,传入的数组必须具有相同的形状,这里的相同的形状可以满足在拼接方向axis轴上数组间的形状一致即可

A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6]])
print(np.concatenate((A, B), axis=0))
"""
[[1, 2],
 [3, 4],
 [5, 6]]
"""
print(np.concatenate((A,B.T),axis = 1))
"""
[[1, 2, 5],
 [3, 4, 6]]
"""

numpy分割

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]])]
"""

numpy copy & deep copy

  • 深拷贝

    深拷贝就是在赋值的时候,不把同一个内存对象的引用赋值给另一个变量,令两个变量所指向的对象不一样,更改值的时候不相互影响,这种操作就是深拷贝

    深拷贝使用copy()函数,copy()会创建一个一模一样的array对象,存储到内存的另一个地址中,然后将这个副本的地址赋值给拷贝对象

    import numpy as np
    A = np.arange(4)
    #[0 1 2 3]
    B = A.copy()
    B[0]=9
    print(A)
    #[0 1 2 3]
    
  • 浅拷贝

    直接使用 = 时 并没有存储任何的值,它只是指向了一个内存地址,而这个地址里存储着array具体的内容。这种将内存引用赋值给另一个变量的操作叫做浅拷贝

    import numpy as np
    A = np.arange(4)
    #[0 1 2 3]
    B = A
    B[0]=9
    print(A)
    #[9 1 2 3]
    

第一次写博客,希望以后也能保持这个习惯

posted @ 2020-09-25 19:43  kitamu  阅读(102)  评论(0)    收藏  举报
Live2D