目录
Python里面的列表、数组的索引称之为切片。本文总结了一下常用切片的语法。
1 列表
列表的切片的通用规则:
A[start:end:step],step为步长,本文默认step为1。
列表分为一维列表和多维列表(本文统一采用二维列表来进行说明),列表切片的场景和语法如下:
列表类型 | 场景描述 | Python表达方法 |
一维列表 | 索引第i个元素 | A[i-1] |
索引第一个元素 | A[0] | |
索引最后一个元素 | A[-1] | |
索引第i到j个元素 | A[i-1:j] | |
索引第一个元素到第i个元素 | A[:i] | |
索引第i个元素到最后一个元素 | A[i-1:] | |
索引全部元素 | A[:] | |
反转列表 | A[::-1] | |
二维列表 | 索引i行j列的元素 | A[i-1][j-1] |
索引第i行 | A[i-1] | |
索引第一行 | A[0] | |
索引最后一行 | A[-1] | |
索引第i行到j行所有元素 | A[i-1:j] | |
索引第1行到i行所有元素 | A[:i] | |
索引第i行到最后一行所有元素 | A[i-1:] | |
按行反转列表 | A[::-1] | |
索引第j列 | [row[j-1] for row in A] | |
索引第一列 | [row[0] for row in A] | |
索引最后一列 | [row[-1] for row in A] | |
索引第i列到j列所有元素 | [row[i-1:j] for row in A] | |
索引第1列到j列所有元素 | [row[:j] for row in A] | |
索引第j列到最后一列所有元素 | [row[j-1:] for row in A] | |
按列反转列表 | [row[::-1] for row in A] | |
索引第i行到第j行的第m列到n列的元素 | [row[m-1:n] for row in A[i-1:j]] | |
索引所有元素 | A[:] |
注:Python里面列表不能转置。
从中可以看出:
- 一维列表元素索引和二维列表行索引的语法是一样的;
- 由于列表在切片时没有列的概念,所以表达方式和数组大不一样。
2 数组
一维数组的表达方式都是一样的,没有需要多说的,主要在于二维数组的表达方式。在numpy里面,由于二维数组有列的概念,所以和二维列表相比,会简单一点。本文总结了两种通用规则。
方法一:完全照搬Matlab里面的表达思路
通用的规则如下:
A[i:j,m:n]
① 当i不写时,索引第一行到第j行;
② 当j不写时,索引第i-1行到最后一行;
③ 当i和j都不写时,索引全部的行;
④ 列的规则和行的规则一样。
数组索引的场景和语法如下:
数组类型 | 场景描述 | Python表达方法 |
一维数组 | 索引第i个元素 | A[i-1] |
索引第一个元素 | A[0] | |
索引最后一个元素 | A[-1] | |
索引第i到j个元素 | A[i-1:j] | |
索引第一个元素到第i个元素 | A[:i] | |
索引第i个元素到最后一个元素 | A[i-1:] | |
索引全部元素 | A[:] | |
反转一维数组 | A[::-1] | |
二维数组 | 索引第i行j列的元素 | A[i-1,j-1] |
索引第i行 | A[i-1,:] | |
索引第一行 | A[0,:] | |
索引最后一行 | A[-1,:] | |
索引第i行到j行所有元素 | A[i-1:j,:] | |
索引第1行到i行所有元素 | A[:i,:] | |
索引第i行到最后一行所有元素 | A[i-1:,:] | |
按行反转数组 | A[::-1,:] | |
索引第j列 | A[:,j-1] | |
索引第一列 | A[:,0] | |
索引最后一列 | A[:,-1] | |
索引第i列到j列所有元素 | A[:,i-1:j] | |
索引第1列到j列所有元素 | A[:,:j] | |
索引第j列到最后一列所有元素 | A[:,j-1:] | |
按列反转数组 | A[:,::-1] | |
索引第i行到第j行的第m列到n列的元素 | A[i-1:j,m-1:n] | |
索引所有元素 | A[:] |
方法二:采用数组转置的概念
通用规则如下:
行索引:A[i],规则和一维数组索引一样;
列索引:先将A转置,然后行索引,最后再转置。即:A.T[j].T
数组索引的场景和语法如下:
数组类型 | 场景描述 | Python表达方法 |
一维数组 | 索引第i个元素 | A[i-1] |
索引第一个元素 | A[0] | |
索引最后一个元素 | A[-1] | |
索引第i到j个元素 | A[i-1:j] | |
索引第一个元素到第i个元素 | A[:i] | |
索引第i个元素到最后一个元素 | A[i-1:] | |
索引全部元素 | A[:] | |
反转数组 | A[::-1] | |
二维数组 | 索引i行j列的元素 | A[i-1,j-1] |
索引第i行 | A[i-1] | |
索引第一行 | A[0] | |
索引最后一行 | A[-1] | |
索引第i行到j行所有元素 | A[i-1:j] | |
索引第1行到i行所有元素 | A[:i] | |
索引第i行到最后一行索引元素 | A[i-1:] | |
按行反转数组 | A[::-1] | |
索引第j列 | A.T[j-1] | |
索引第一列 | A.T[0] | |
索引最后一列 | A.T[-1] | |
索引第i列到j列所有元素 | A.T[i-1:j].T | |
索引第1列到j列所有元素 | A.T[:j].T | |
索引第j列到最后一列所有元素 | A.T[j-1:].T | |
按列反转数组 | A.T[::-1].T | |
索引第i行到第j行的第m列到n列的元素 | A[i-1:j,m-1:n] | |
索引所有元素 | A[:] |
注:Python里面向量没有转置的概念。
笔者认为只要能抓住是否要转置这个点,方法二的思路比方法一的思路更加清明了。因为可以发现在方法二中,无论是一维数组索引、二维数组行索引、二维数组列索引,"[]"中索引的填写规则都是一样的。