站点图标 兰玉磊的个人博客

Numpy数组

NumPy 是什么?

NumPy是使用Python进行科学计算的基础软件包。

除其他外,它包括:

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元素,也可以使用进行切片访问元素,例如:

数组常用的属性

Numpy中创建数组可支持的类型:

使用dtype参数创建array

在使用Python列表或者元组来创建Numpy数组的时候,所创建的数组类型,由原来的元素类型推倒而来,例如:

数组常用的方法

在通常情况下,创建Numpy数组的时候,需要去初始化Numpy数组的值,因此Numpy为我们提供了一些初始化值的方法,例如:

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则是直接拷贝,也就是新开辟一块内存地址,存储新的数据,和原来的数据不会关联,例如:

退出移动版