numpy学习笔记

numpy学习

Why numpy?

numpy是科学运算中非常重要的一个模块,在数据分析、机器学习、深度学习等方面都有应用

其优点包括:

  • 运算速度快:numpy都是采用C语言编写
  • 消耗资源少:采用的是矩阵运算,会比 python 自带的字典或者列表快很多

安装

一般anaconda环境会自带numpy

Numpy的安装文件地址是这里。里面有不同版本,有开发者版本和稳定版本。同时根据不同的系统选择不同的版本进行下载。

或者通过终端进行安装

pip3 install numpy

导入模块

import numpy as np #为了方便使用numpy 采用np简写

创建矩阵

array

array = np.array([[1,2,3],[2,3,4]])  #列表转化为矩阵
print(array)
"""
array([[1, 2, 3],
       [2, 3, 4]])
"""

可以使用dtype属性来指定矩阵数据类型

a = np.array([2,23,4],dtype=np.int)
print(a.dtype)
# int 64

创建全零矩阵

a = np.zeros((3,4)) # 数据全为0,3行4列
"""
array([[ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.]])
"""

创建全一矩阵

a = np.ones((3,4),dtype = np.int)   # 数据为1,3行4列
"""
array([[1, 1, 1, 1],
       [1, 1, 1, 1],
       [1, 1, 1, 1]])
"""

创建全空矩阵

a = np.empty((3,4)) # 数据为empty,3行4列
"""
array([[  0.00000000e+000,   4.94065646e-324,   9.88131292e-324,
          1.48219694e-323],
       [  1.97626258e-323,   2.47032823e-323,   2.96439388e-323,
          3.45845952e-323],
       [  3.95252517e-323,   4.44659081e-323,   4.94065646e-323,
          5.43472210e-323]])
"""

创建连续矩阵

a = np.arange(10,20,2) # 10-19 的数据,2步长
"""
array([10, 12, 14, 16, 18])
"""

创建线段型数据:

a = np.linspace(1,10,20)    # 开始端1,结束端10,且分割成20个数据,生成线段
"""
array([  1.        ,   1.47368421,   1.94736842,   2.42105263,
         2.89473684,   3.36842105,   3.84210526,   4.31578947,
         4.78947368,   5.26315789,   5.73684211,   6.21052632,
         6.68421053,   7.15789474,   7.63157895,   8.10526316,
         8.57894737,   9.05263158,   9.52631579,  10.        ])
"""

创建随机元素的矩阵

a=np.random.random((2,4))  # 创建一个2*4的矩阵,元素随机填充

使用 reshape 改变数据的形状

a = np.arange(12).reshape((3,4))    # 3行4列,0到11
"""
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
"""

a = np.linspace(1,10,20).reshape((5,4)) # 更改shape
"""
array([[  1.        ,   1.47368421,   1.94736842,   2.42105263],
       [  2.89473684,   3.36842105,   3.84210526,   4.31578947],
       [  4.78947368,   5.26315789,   5.73684211,   6.21052632],
       [  6.68421053,   7.15789474,   7.63157895,   8.10526316],
       [  8.57894737,   9.05263158,   9.52631579,  10.        ]])
"""

属性

  • ndim:维度

    print('number of dim:',array.ndim)  # 维度
    
    # number of dim: 2
    
  • shape:行数和列数

    print('shape :',array.shape)    # 行数和列数
    
    # shape : (2, 3)
    
  • size:元素个数

    print('size:',array.size)   # 元素个数
    
    # size: 6
    

基本运算

import numpy as np
a=np.array([10,20,30,40])   # array([10, 20, 30, 40])
b=np.arange(4)              # array([0, 1, 2, 3])

加法

c=a+b   # array([10, 21, 32, 43])

减法

c=a-b  # array([10, 19, 28, 37])

乘法

c=a*b   # array([  0,  20,  60, 120])

乘方

c=b**2  # array([0, 1, 4, 9])

三角函数

c=10*np.sin(a)  
# array([-5.44021111,  9.12945251, -9.88031624,  7.4511316 ])

逻辑判断

print(b<3)  
# array([ True,  True,  True, False], dtype=bool)

矩阵乘法

需要注意的是,以上的各操作都是对对应元素进行的运算

那么这里介绍一下两个矩阵进行乘法的方法

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

除此之外还有另外的一种关于dot的表示方法

c_dot_2 = a.dot(b)
# array([[2, 4],
#       [2, 3]])

最大值、最小值、求和

np.sum(a)  
np.min(a) 
np.max(a)

输出索引

np.argmin(a)
np.argmax(a)

需要注意的是,这里的作用范围是矩阵a全局的元素,如果想对矩阵中的行或列求最大值、最小值、求和,则需要使用axis这一属性

np.sum(a,axis=1)
np.min(a,axis=1)
np.max(a,axis=0)

axis的值为0的时候,将会以列作为查找单元, 当axis的值为1的时候,将会以行作为查找单元

平均值

np.mean(a)
a.mean()

同样的该函数中也可以添加axis属性来对矩阵中的行或列求平均值

中位数

np.median(a)
a.median()

累加

A = np.arange(2,14).reshape((3,4)) 

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

print(np.cumsum(A)) 

# [2 5 9 14 20 27 35 44 54 65 77 90]

累差

A = np.arange(2,14).reshape((3,4)) 

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

print(np.diff(A))    

# [[1 1 1]
#  [1 1 1]
#  [1 1 1]]

找出非0数

将所有非零元素的行与列坐标分割开,重构成两个分别关于行和列的矩阵。

A = np.arange(2,14).reshape((3,4)) 

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

print(np.nonzero(A))    

# (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]))

返回两个列表,分别为不为0的数的行和列的标号

排序

np.sort(a)

转置

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

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()

clip(Array,Array_min,Array_max)

Array指的是将要被执行用的矩阵,而后面的Array_minArray_max则用于让函数判断矩阵中元素是否有比Array_min小的或者比Array_max大的元素,并将这些指定的元素转换为Array_min或者Array_max

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

索引

取值

在元素列表或者数组中,我们可以用如同a[2]一样的表示方法,同样的,在Numpy中也有相对应的表示方法。

此外,对于二维索引,numpy除可以使用a[1][1]还可以使用a[1, 1]进行等效的索引

在Python的 list 中,我们可以利用:对一定范围内的元素进行切片操作,在Numpy中我们依然可以给出相应的方法:

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

print(A[1, 1:3])    # [8 9]

for循环迭代

迭代行

for row in A:
    print(row)
"""    
[ 3,  4,  5, 6]
[ 7,  8,  9, 10]
[11, 12, 13, 14]
"""

迭代列(迭代转置矩阵的行)

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

迭代项

A = np.arange(3,15).reshape((3,4))

print(A.flatten())   
# array([3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])

for item in A.flat:
    print(item)

# 3
# 4
# ……
# 14

flatten是一个展开性质的函数,将多维的矩阵进行展开成1行的数列。而flat是一个迭代器,本身是一个object属性。

Numpy array 合并

上下合并

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

需要注意的是,这种合并方式要求矩阵的每行元素个数相同

左右合并

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

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

print(D)
# [1,1,1,2,2,2]

增加矩阵维度

也可用于将行向量(一维矩阵)转置为列向量

In [1]: np.linspace(1, 10, 10)
Out[1]: array([ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.])

In [2]: np.linspace(1, 10, 10)[np.newaxis,:]
Out[2]: array([[ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.]])

In [3]: np.linspace(1, 10, 10)[:,np.newaxis]
Out[3]:
array([[ 1.],
[ 2.],
[ 3.],
[ 4.],
[ 5.],
[ 6.],
[ 7.],
[ 8.],
[ 9.],
[ 10.]])

In [4]: np.linspace(1, 10, 10).shape
Out[4]: (10,)

In [5]: np.linspace(1, 10, 10)[np.newaxis,:].shape
Out[5]: (1, 10)

In [6]: np.linspace(1, 10, 10)[:,np.newaxis].shape
Out[6]: (10, 1)

拼接

当你的合并操作需要针对多个矩阵或序列时,借助concatenate函数可能会让你使用起来比前述的函数更加方便:

C = np.concatenate((A,B,B,A),axis=0)

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

axis参数很好的控制了矩阵的纵向或是横向打印,相比较vstackhstack函数显得更加方便。

Numpy array 分割

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))
"""
[array([[0, 1],
        [4, 5],
        [8, 9]]), array([[ 2,  3],
        [ 6,  7],
        [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=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]])]

不等量的分割

需要注意的是,范例的Array只有4列,只能等量对分,而如果想要进行不等量的分割,就要用到np.array_split()

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

copy

在numpy中,= 的赋值方式会带有关联性,如:

import numpy as np

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

b = a
c = b

改变a的第一个值,bc的第一个值也会同时改变。

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

b is a  # True
c is a  # True

可以理解为直接使用=进行赋值是将a的引用传递给了bc

那么如果我们仅仅是想将a现在的值传递给b而并不希望他们以后也具有关联性的话就需要用到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])

参考资料

Numpy & Pandas 教程系列 | 莫烦Python
numpy.concatenate-NumPy
np.newaxis 为 numpy.ndarray(多维数组)增加一个轴

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值