一、多维数组

Python提供的基础数据结构列表、元组等都是可以看做简单的一维数组,那么用到多维数组时该如何处理呢?因为当前的结构中的每个元素都是不限类型的,而每种结构也是一种类型,那么理所当然可以想到将基础数据结构嵌入到基础数据结构中得到多维数据结构:

python 一维数组存储在list python一维数组怎么定义_数组

 

二、NumPy数组基础

NumPy是Python的一个扩展程序库,支持大量的为读书族与矩阵运算,并且针对数组运算提供了大量的数学函数库。

引用NumPy库并创建数组:

python 一维数组存储在list python一维数组怎么定义_python_02

还可以通过empty方法来创建一个指定维度、数据类型但是未赋初值数组:

python 一维数组存储在list python一维数组怎么定义_python 一维数组存储在list_03

还可以通过 numpy.zeros 创建指数组元素都是 0的数组:

通过 numpy.ones 创建数组元素都是1的数组;

NumPy 数组的维数称为秩(rank),秩就是轴的数量,即数组的维度,一维数组的秩为 1,二维数组的秩为 2,以此类推。

在 NumPy中,每一个线性的数组称为是一个轴(axis),也就是维度(dimensions)。比如说,二维数组相当于是两个一维数组,其中第一个一维数组中每个元素又是一个一维数组。所以一维数组就是 NumPy 中的轴(axis),第一个轴相当于是底层数组,第二个轴是底层数组里的数组。而轴的数量——秩,就是数组的维数。

很多时候可以声明 axis。axis=0,表示沿着第 0 轴进行操作,即对每一列进行操作;axis=1,表示沿着第1轴进行操作,即对每一行进行操作。

属性

说明

ndarray.ndim

秩,即轴的数量或维度的数量

ndarray.shape

数组的维度,对于矩阵,n 行 m 列

ndarray.size

数组元素的总个数,相当于 .shape 中 n*m 的值

ndarray.dtype

ndarray 对象的元素类型

ndarray.itemsize

ndarray 对象中每个元素的大小,以字节为单位

ndarray.flags

ndarray 对象的内存信息

ndarray.real

ndarray元素的实部

ndarray.imag

ndarray 元素的虚部

ndarray.data

包含实际数组元素的缓冲区,由于一般通过数组的索引获取元素,所以通常不需要使用这个属性。

三、numpy的数组的高级索引

NumPy 比一般的 Python 序列提供更多的索引方式。除了之前看到的用整数和切片的索引外,数组可以由整数数组索引、布尔索引及花式索引。

整数数组索引:根据数组索引确定位置:

python 一维数组存储在list python一维数组怎么定义_numpy_04

定义的数组索引为 [[0,1,2],[0,1,2]],即为取对应(0,0) (1,1)(2,2)位置的值

 

布尔索引:通过布尔因素安来获取符合指定条件的元素:

python 一维数组存储在list python一维数组怎么定义_python 一维数组存储在list_05

获取array0中对3取余数为0的元素;

 

花式索引是根据索引数组的值作为目标数组的某个轴的下标来取值。对于使用一维整型数组作为索引,如果目标是一维数组,那么索引的结果就是对应位置的元素;如果目标是二维数组,那么就是对应下标的行。

python 一维数组存储在list python一维数组怎么定义_python 一维数组存储在list_06

还可以传入倒叙索引数组,即传入负数索引;

以及使用np.ix_ 来传入多个索引数组,如果 np.xi_ 中输入两个列表,则第一个列表存的是待提取元素的行标,第二个列表存的是待提取元素的列标,第一个列表中的每个元素都会遍历第二个列表中的每个值,构成新矩阵的一行元素。

四、数组操作

数组可以进行数学运算,在数组shape相同时,进行加减乘除即为对应位置元素加减乘除:

python 一维数组存储在list python一维数组怎么定义_numpy_07

在进行运算的两个数组是不同形状时,会有一个广播(broadcast)机制:

  • 让所有输入数组都向其中形状最长的数组看齐,形状中不足的部分都通过在前面加 1 补齐。
  • 输出数组的形状是输入数组形状的各个维度上的最大值。
  • 如果输入数组的某个维度和输出数组的对应维度的长度相同或者其长度为 1 时,这个数组能够用来计算,否则出错。
  • 当输入数组的某个维度的长度为 1 时,沿着此维度运算时都用此维度上的第一组值。

例如:

python 一维数组存储在list python一维数组怎么定义_numpy_08

此外还有一些操作:

reshape

不改变数据的条件下修改形状

flat

数组元素迭代器

flatten

返回一份数组拷贝,对拷贝所做的修改不会影响原始数组

ravel

返回展开数组

transpose

对换数组的维度

ndarray.T

self.transpose() 相同

rollaxis

向后滚动指定的轴

swapaxes

对换数组的两个轴

broadcast

产生模仿广播的对象

broadcast_to

将数组广播到新形状

expand_dims

扩展数组的形状

squeeze

从数组的形状中删除一维条目

concatenate

连接沿现有轴的数组序列

stack

沿着新的轴加入一系列数组。

hstack

水平堆叠序列中的数组(列方向)

vstack

竖直堆叠序列中的数组(行方向)

split

将一个数组分割为多个子数组

hsplit

将一个数组水平分割为多个子数组(按列)

vsplit

将一个数组垂直分割为多个子数组(按行)

resize

返回指定形状的新数组

append

将值添加到数组末尾

insert

沿指定轴将值插入到指定下标之前

delete

删掉某个轴的子数组,并返回删除后的新数组

unique

查找数组内的唯一元素