Numpy数组

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列表是一样的,通过下标去访问数据。

如,通过一维数组保存学生的成绩,且通过索引获取数组数据:

Numpy数组

多维数组

二维数组

二维数组就是一个所有元素都是一维数组的数组。

在上面的介绍中,使用了一维数组存储了一个学生的成绩,那么如果想存储所有学生的成绩,就需要使用二维数组,同时二维数组也是一个矩阵。

通过图像描述一下:

Numpy数组

上图中,每行对应一名学生,每列对应一门课程,矩阵中的每一个元素,都需要使用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]]

数组的形状

数组的形状,描述了数组的维度,以及各个维度内部的元素个数。

Numpy数组

上图中这个二维数组,它的形状是(30, 5),这里有两个数字,它们分别表示,第一个维度和第二个维度的元素个数,其中,30表示第一个维度,5表示第二个维度。

形状(30, 5)也表示它是一个30 * 5的二维矩阵。

数组的形状用一个元组来表示,它描述了数组的维数和长度。

多维数组

Numpy数组

上图中就是一个多维数组的描述,分别有三维数组,四维数组,五维数组。

通过上图可以狠清晰明了的看出,三维包二维,四维包三维等等以此类推。

创建数组

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数组

数组常用的属性

  • ndim 数组的维度
  • shape 数组的形状
  • size 数组元素的总个数
  • dtype 数组中元素的数据类型
  • itemsize 数组中每个元素的字节数
Numpy数组

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

  • int8、uint8、int16、uint16、int32、uint32、int64、uint64
  • float16、float32、float64、float128
  • complex64、complex128、complex256
  • bool、object、string_、unicode_

使用dtype参数创建array

Numpy数组

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

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

Numpy数组

本文为原创文章,未经授权禁止转载本站文章。
原文出处:兰玉磊的个人博客
原文链接:https://www.fdevops.com/2020/03/04/numpy-2111
版权:本文采用「署名-非商业性使用-相同方式共享 4.0 国际」知识共享许可协议进行许可。

(4)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
兰玉磊的头像兰玉磊
上一篇 2020年3月2日
下一篇 2020年3月8日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注