NumPy 是什么?
NumPy是使用Python进行科学计算的基础软件包。
除其他外,它包括:
- 功能强大的N维数组对象。
- 精密广播功能函数。
- 集成 C/C+和Fortran 代码的工具。
- 强大的线性代数、傅立叶变换和随机数功能。
NumPy 最重要的一个特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引。
ndarray 对象是用于存放同类型元素的多维数组。ndarray 中的每个元素在内存中都有相同存储大小的区域。
ndarray对象的内容可以通过索引或切片来访问和修改,与 Python 中 list 的切片操作一样。
ndarray 数组可以基于 0 – n 的下标进行索引,切片对象可以通过内置的 slice 函数,并设置 start, stop 及 step 参数进行,从原数组中切割出一个新数组。
一维数组
通过一维空间的理论来介绍一下什么叫做一维数组。
“一维空间是指只由一条线内的点所组成的空间,它只有长度,没有宽度和高度,只能向两边无限延展。”
通过对一维空间的介绍,可以很容易理解什么是一维数组,就拿Python中的列表举例,列表中仅仅存储基本类型的列表就是一个一维列表。
例如: list = [1, 2, 3, 4, 5, 6]
数组的获取数据方式跟Python列表是一样的,通过下标去访问数据。
如,通过一维数组保存学生的成绩,且通过索引获取数组数据:
多维数组
二维数组
二维数组就是一个所有元素都是一维数组的数组。
在上面的介绍中,使用了一维数组存储了一个学生的成绩,那么如果想存储所有学生的成绩,就需要使用二维数组,同时二维数组也是一个矩阵。
通过图像描述一下:
上图中,每行对应一名学生,每列对应一门课程,矩阵中的每一个元素,都需要使用score[i, j]来表示,其中 i 是行的下标,对应一名学生;j 是列的下标,对应一门课程。
图1中,想要获取学生 0 的语文成绩,则表示为score[0, 0] = 85
图2中,想要获取学生 0 的历史成绩,则表示为score[0, 3] = 94
图3中,想要获取学生 29 的物理成绩,则表示为score[29, 4] = 80
这就是二维数组的获取元素数据的方式。
在程序中,二维数组的表达方式:
[[ 1, 2, 3, 4, 5], [ 6, 7, 8, 9, 10], [ 11, 12, 13, 14, 15]]
数组的形状
数组的形状,描述了数组的维度,以及各个维度内部的元素个数。
上图中这个二维数组,它的形状是(30, 5),这里有两个数字,它们分别表示,第一个维度和第二个维度的元素个数,其中,30表示第一个维度,5表示第二个维度。
形状(30, 5)也表示它是一个30 * 5的二维矩阵。
数组的形状用一个元组来表示,它描述了数组的维数和长度。
多维数组
上图中就是一个多维数组的描述,分别有三维数组,四维数组,五维数组。
通过上图可以狠清晰明了的看出,三维包二维,四维包三维等等以此类推。
创建数组
Numpy创建数组通常使用np.array([列表]/(元组))方法来创建,在Numpy中数组的类型就是强大ndarray类型。
import numpy as np # 创建数组 np_array = np.array([1, 2, 3, 4, 5]) # 创建二维即多维数组 np_array = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]) # 获取数据类型 print(type(np_array))
array可以使用索引访问array元素,也可以使用进行切片访问元素,例如:
数组常用的属性
- ndim 数组的维度
- shape 数组的形状
- size 数组元素的总个数
- dtype 数组中元素的数据类型
- itemsize 数组中每个元素的字节数
Numpy中创建数组可支持的类型:
- int8、uint8、int16、uint16、int32、uint32、int64、uint64
- float16、float32、float64、float128
- complex64、complex128、complex256
- bool、object、string_、unicode_
使用dtype参数创建array
在使用Python列表或者元组来创建Numpy数组的时候,所创建的数组类型,由原来的元素类型推倒而来,例如:
数组常用的方法
在通常情况下,创建Numpy数组的时候,需要去初始化Numpy数组的值,因此Numpy为我们提供了一些初始化值的方法,例如:
- np.ones() 创建全1的数组
- np.zeros() 创建全0的数组
- np.arange() 创建数字序列数组
- np.eye() 创建单位矩阵
- np.linspace() 创建等差数列
- np.logspace() 创建等比数列
arange()方法:创建一个由数字序列构成的数组。
np.arange(起始数字,结束数字,步长,dtype=数据类型)
跟Python的列表一样,都是前闭后开的:数字序列中不包括结束数字。
起始数字省略时,默认从0开始。
步长省略时,默认1
>>> np.arange(4) array([0, 1, 2, 3]) >>> np.arange(0, 2, 0.3) # 起始值0,结束值2,步长0.3 array([0. , 0.3, 0.6, 0.9, 1.2, 1.5, 1.8])
ones()方法:创建一个元素全为1的数组。
np.ones(shape, dtype=数据类型)
>>> np.ones((3, 2), dtype=np.int16) array([[1, 1], [1, 1], [1, 1]], dtype=int16) >>> np.ones((3, 2)) array([[1., 1.], [1., 1.], [1., 1.]])
从例子中可以看出,当不指定类型的时候,元素的值默认为float64
zeros()方法:创建一个元素全为0的数组。
np.zeros(shape, dtype=数据类型)
这个方法和ones()的用法是一样的,就不过多解释了。
eye()方法:创建一个单位矩阵。
np.eye(shape)
# 创建一个3 * 3的单位矩阵 >>> np.eye(3) array([[1., 0., 0.], [0., 1., 0.], [0., 0., 1.]]) # 创建一个2 * 3的单位矩阵 >>> np.eye(2, 3) array([[1., 0., 0.], [0., 1., 0.]])
linspace()方法:创建一个等差数列。
np.linspace(start, stop, num=50)
>>> np.linspace(1, 10, 10) array([ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.])
logspace()方法:创建一个等比数列。
np.logspace(start, stop, num=50, base=10)
>>> np.logspace(1, 5, 5, base=2) array([ 2., 4., 8., 16., 32.])
asarray()方法:将列表或者元组转化为数组对象。
asarray也是一个创建数组的方法,和array不同的是,当asarray和array的参数已经是数组的时候,array的参数是引用类型,asarray则是直接拷贝,也就是新开辟一块内存地址,存储新的数据,和原来的数据不会关联,例如: