一、认识numpy

1.numpy简介

        NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。

        NumPy 的前身 Numeric 最早是由 Jim Hugunin 与其它协作者共同开发,2005 年,Travis Oliphant 在 Numeric 中结合了另一个同性质的程序库 Numarray 的特色,并加入了其它扩展而开发了 NumPy。NumPy 为开放源代码并且由许多协作者共同维护开发。

2.numpy安装

在cmd窗口输入pip install numpy即可

pip install numpy

然后在cmd窗口输入python,进入python环境,输入以下代码检验numpy模块是否安装成功

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

另外你可以输入np.__version__来查看你安装的numpy是哪一个版本

二、基础知识

1.创建numpy数组

numpy中的数组是numpy.ndarray型的对象,其中元素的数据类型和大小都是一样的,接下来让我们来如何创建一个numpy数组

numpy.array(object, dtype=None, *, copy=True, order='K', subok=False, ndmin=0)

object:是一个列表,其中可以通过嵌套多级列表来控制数组的维度

dtype:指定数组中元素的类型,包括复数类型

copy:对象是否需要复制

order:创建数组的样式

subok:为False会返回一个与基类类型一致的数组,否则子类将被传递

ndmin:指定数组的最小维度,关于维度,我们可以数输出后的数组的第一个元素前面有几个左方括号,有几个就是几维

创建一个numpy数组

array = np.array([1,3.14,'hello'])  #这是一个最简单的numpy数组

numpy数组中的类型会被统一成所有元素中优先级最高的元素的类型,优先级:str>float>int

比如array中的元素全部都是字符串类型

此外,还有几种创建numpy数组的方法

np.eye(5)  #生成一个5×5的对角矩阵
np.ones((5,3))  #创建一个5行3列的全部元素都是1的矩阵
np.zeros(shape=(3,3))  #创建一个3行3列的全部元素都是0的矩阵
np.full(shape=(2,3),fill_value=6)  #创建一个2行3列的元素都是6的矩阵
np.random.randint(0,10,size=(4,3))  #生成1个4行3列的元素为0到10之间的整数的矩阵
np.arange(0,11,step=1)   #产生0到10的ndarray列表,步长为1

2.元素访问

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

多层级访问

print(array[0][1],array[1,2])
print(array[[0,1],[1,2]])      #访问2,4

以列表作为索引访问

array1=np.array([1,2,3,4,5,6])
array1[[0,2,4]]   #访问1,3,5

使用bool列表访问

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

切片访问

array2=np.random.randint(0,10,size=(5,4,3))
'''生成的array为:
[[[4, 1, 7],
        [3, 2, 5],
        [1, 6, 1],
        [6, 7, 7]],

       [[3, 3, 9],
        [5, 9, 0],
        [9, 4, 6],
        [2, 0, 4]],

       [[6, 0, 0],
        [0, 1, 7],
        [5, 7, 4],
        [7, 1, 4]],

       [[0, 6, 3],
        [5, 9, 8],
        [7, 1, 3],
        [4, 5, 3]],

       [[8, 0, 8],
        [4, 4, 4],
        [8, 7, 1],
        [0, 0, 3]]]'''

每个维度内跟列表的切片访问原理相同,每个维度之间用逗号隔开

array2[0:2,1:3,1:3]

访问的是第三维度的第0和第1两个元素,第二维度的第1和第2两个元素,第一维度的第1和第2两个元素

3.Numpy数组的属性

shape:数组的维度,如(5,3)表示该数组是5行3列

size:数组中元素的总个数

dtype:数组中元素的类型

ndim:数组的秩,一维的秩为1,二维数组的秩为2,以此类推

itemsize:数组中每个元素的大小

flags:数组的内存信息

4.改变形状

矩阵的维度是可以改变的,但是改变前后矩阵中元素的总个数要相同

array2.reshape(2,3,10)  #5×4×3=2×3×10=60

5.级联

concatenate函数

#concatenate((a1, a2, ...), axis=0, out=None)
#axis=0 横向连接
#axis=1 纵向连接

横向连接 numpy.vstack()

纵向连接 numpy.hstack()

6.切割

#numpy.split(ary, indices_or_sections, axis=0)
#ary是被切割的对象
#indices_or_sections是被切割为几块  切割方向的元素数量要能够整除它
#也可以是一个列表
#axis控制横向切还是纵向切
#同样也有np.hsplit()和np.vsplit()
arr=np.random.randint(1,100,size=(6,6))
part1,part2=np.split(arr,indices_or_sections=2)  #切割为两个数组
arr1=np.split(arr,indices_or_sections=[2,5],axis=0)
#前两行是一块,第三行到第五行是一块,最后一行又是一块

7.产生随机数

linspace函数

#np.linspace(start,stop,num=50,endpoint=True,retstep=False,dtype=None,axis=0,)
#主要看前三个参数 从start开始,到stop停,等差的产生num个数字
print(np.linspace(4,9,3))
#输出[4.  6.5 9. ]

random.randn(n):从标准正态分布中返回n个值

random.normal(): 从高斯分布中返回值

random.permutation(n):随即返回一个打乱的序列,可用于随机访问

8.聚合操作

求和:sum()
求平均值:mean()
求最大值:max()
求最小值:min()
求最大值的索引:argmin()
求标准方差:std()
求方差:var()
求中位数:median()

快速排序:sort()
查看是否有True:any()

查看是否全部为True:all()

9.广播机制

广播机制输出的数组是输入数组形状的各个维度上的最大值。

如果两个数组的形状相同,则对应元素相加

如果两个数组的形状不同,则必须有一个维度的长度为1,否则就会报错

10.矩阵操作

跟线性代数中讲的一样,这里就不具体写了

由于本人水平有限,文中不当之处还请各位大佬多多指正

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐