python数组列表操作简记二
一、列表配对组合为新列表或字典
1.1多个列表配对组合为新列表
使用python的内置zip函数可将多个列表配对组合为一个新的列表,新列表中元素为原列表同一位置的元素组成的tuple类型元素,但zip函数并不直接返回列表变量,而是返回迭代器,可对其进行迭代读取,也可转换为列表变量。
示例代码如下:
lt01 = [1, 2, 3, 4]
lt02 = ['a', 'b', 'c', 'd']
lt03 = [5, 6, 7, 8]
for item in zip(lt01, lt02, lt03):
print(item)
print(item[0])
print(item[1])
print(item[2])
lt04 = list(zip(lt01, lt02, lt03))
zip对拆分组合的列表长度不要求一致,当列表长度不一致时会匹配到最短长度的列表的最后一个元素,其他列表的元素会被忽略掉。
组合成的新列表也可通过zip逆操作得到原始列表,示例代码如下:
lt05, lt06, lt07 = zip(*lt04)
1.2两个列表配对转换为字典
zip函数可将两个列表配对转换为字典变量,第一个列表的元素作为键,第二个列表的元素作为对应的值,示例代码如下:
lt01 = [1, 2, 3, 4]
lt02 = ['a', 'b', 'c', 'd']
dict01 = dict(zip(lt01, lt02))
当两个列表长度不一致时,以较短长度的列表为准,此外对于第一个列表如果有重复的元素,那么该元素对应的键值会被后一个键值覆盖掉。
二、数组加减乘除运算
以numpy定义的一维数组为例,进行加减乘除运算。
2.1一维数组加减除运算
一维数组加减运算,既可以是加减一个常数,也可以是一维数组间相同位置元素进行加减,示例代码如下:
import numpy as np
a01 = np.array([1, 2, 3, 4])
a02 = np.array([0, 1, 2, 3])
a03 = a01 + 1
a03 = np.add(a01, 1)#与上行代码效果相同
a04 = a01 - 1
a04 = np.subtract(a01, 1)#与上行代码效果相同
a05 = a01 + a02
a05 = np.add(a01, a02)#与上行代码效果相同
a06 = a01 - a02
a06 = np.subtract(a01, a02)#与上行代码效果相同
一维数组除法运算,既可以是除上一个常数,也可以是一维数组间相同位置元素进行除法,示例代码如下:
import numpy as np
a01 = np.array([4, 5, 6, 7])
a02 = np.array([1, 2, 3, 4])
a03 = a01 / 2
a03 = np.divide(a01, 2)#与上行代码效果相同
a04 = a01 // 2#得到除以2的整数部分,相当于除以2后再进行int类型强转换
a04 = a01 % 2#对2取余数
a05 = a01 / a02
a05 = np.divide(a01, a02)#与上行代码效果相同
a06 = a01 // a02
a06 = a01 % a02
2.2一维数组乘法运算
一维数组可认作向量,向量的乘法常见的有4种,分别为相同位置元素相乘、点积、叉积、外积,示例代码如下:
import numpy as np
a01 = np.array([1, 2, 3, 4])
a02 = np.array([0, 1, 2, 3])
a03 = a01 * 2
a03 = np.multiply(a01, 2)#与上行代码效果相同
a03 = a01 ** 2#2次方运算
a04 = a01 * a02#相同位置元素相乘
a04 = np.multiply(a01, a02)#与上行代码效果相同
a05 = a01.dot(a02)#点积,结果为数值,运算过程与数学上的数量积运算一致
a05 = a02.dot(a01)#与上行代码结果相同
a05 = np.dot(a01, a02)#与上行代码结果相同
a06 = np.outer(a01, a02)#外积,结果为使用a01中的每个元素乘以a02向量,最终得到一个4×4的矩阵
a01 = np.array([1, 2, 3])
a02 = np.array([0, 1, 2])
a07 = np.cross(a01, a02)#叉积,叉积运算只能用于二维向量或三维向量,二维向量的叉积结果为数值,三维叉积结果为向量,运算过程与数学上的向量积运算一致
三、数组切片读取
以numpy定义的数组为例。
3.1一维数组切片读取
一维数组切片读取方式,与列表读取方式一致,示例代码如下:
import numpy as np
a01 = np.array([1,2,3,4,5,6])
a02 = a01[1:6]
a02 = a01[:-1]
a02 = a01[1:]
a02 = a01[1:6:2]#获取索引为1到5的元素,步长为2
a02 = a01[::2]#获取奇数组
a02 = a01[1::2]#获取偶数组
3.2二维数组切片读取
二维数组可认作矩阵,示例代码如下:
import numpy as np
a01 = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])#维度为3×4,输出如下
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12]])
a02 = a01[1]#取矩阵第二行,输出如下
array([5, 6, 7, 8])
a02 = a01[1,:]#取矩阵第二行,输出如下
array([5, 6, 7, 8])
a02 = a01[0:2]#取矩阵第一、二行,输出如下
array([[1, 2, 3, 4],
[5, 6, 7, 8]])
a02 = a01[0:2,:]#取矩阵第一、二行,输出如下
array([[1, 2, 3, 4],
[5, 6, 7, 8]])
a03 = a01[:,0]#取矩阵第一列,输出如下
array([1, 5, 9])
a03 = a01[:,0:2]#取矩阵第一、二列,输出如下
array([[ 1, 2],
[ 5, 6],
[ 9, 10]])
a04 = a01[1,1:]#取矩阵第二行的第二个列元素至最后一个列元素,返回一维数组,输出如下
array([6, 7, 8])
a04 = a01[1:,1]#取矩阵第二列的第二个行元素至最后一个行元素,返回一维数组,输出如下
array([ 6, 10])
a04 = a01[1:,1:]#取矩阵第二行、第二列开始至最后一个行列元素,返回二维数组,输出如下
array([[ 6, 7, 8],
[10, 11, 12]])
a04 = a01[0::2,1::2]#取矩阵第一行、第二列开始至最后一个行列元素,步长为2,返回二维数组,输出如下
array([[ 2, 4],
[10, 12]])
二维数组的读取可以简单概括为通过行索引,列索引指定,行索引与列索引之间用逗号隔开,行列索引语法规则与一维数组及列表读取的语法一致。
3.3三维数组切片读取
三维数组切片读取与二维数组切片读取类似,可以简单概括为通过第一维索引,第二维索引,第三维索引指定,索引之间用逗号隔开。示例代码如下:
import numpy as np
a01 = np.array([[[1,2,3,4],[5,6,7,8],[9,10,11,12]], [[10,20,30,40],[50,60,70,80],[90,100,110,120]]])#维度为2×3×4,输出如下
array([[[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12]],
[[ 10, 20, 30, 40],
[ 50, 60, 70, 80],
[ 90, 100, 110, 120]]])
a02 = a01[0]#输出如下
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12]])
a02 = a01[:,0,:]#输出如下
array([[ 1, 2, 3, 4],
[10, 20, 30, 40]])
a02 = a01[:,:,0]#输出如下
array([[ 1, 5, 9],
[10, 50, 90]])
a02 = a01[:,0:2,1:3]#输出如下
array([[[ 2, 3],
[ 6, 7]],
[[20, 30],
[60, 70]]])
a02 = a01[1:,0:2,0:3:2]#输出如下
array([[[10, 30],
[50, 70]]])
三维数组切片读取时,要注意读取出来的数组维度,并不容易直观判断出来。
四、数组简单筛选
以numpy定义的数组为例。
4.1筛选数组中满足指定条件的元素
示例代码如下:
import numpy as np
a01 = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])#维度为3×4,输出如下
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12]])
a02 = a01[a01 > 6]#筛选出数组中大于6的元素,输出如下
array([ 7, 8, 9, 10, 11, 12])
a03 = a01 > 6#输出如下
array([[False, False, False, False],
[False, False, True, True],
[ True, True, True, True]])
a04 = a01[a03]#结果与a01[a01>6]相同,输出如下
array([ 7, 8, 9, 10, 11, 12])
a03 = (a01 > 6) & (a01 < 10)#输出如下
array([[False, False, False, False],
[False, False, True, True],
[ True, False, False, False]])
a04 = a01[a03]#筛选出数组中大于6小于10的元素,输出如下
array([7, 8, 9])
4.2筛选数组中最大最小元素及索引
示例代码如下:
import numpy as np
a01 = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])#维度为3×4,输出如下
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12]])
min_a01 = np.min(a01)#获取数组中最小元素,输出如下
1
index01 = np.argmin(a01)#获取数组中最小元素的索引,索引为数组展平为一维数组后的索引,输出如下
0
max_a01 = np.max(a01)#获取数组中最大元素,输出如下
12
index02 = np.argmax(a01)#获取数组中最大元素的索引,索引为数组展平为一维数组后的索引,输出如下
11
min_a01_column = np.min(a01, 0)#获取数组中每一列最小元素,返回数组,输出如下
array([1, 2, 3, 4])
a02 = np.argmin(a01, 0)#获取数组中每一列最小元素的索引,返回数组,输出如下
array([0, 0, 0, 0], dtype=int64)
min_a01_row = np.min(a01, 1)#获取数组中每一行最小元素,返回数组,输出如下
array([1, 5, 9])
a02 = np.argmin(a01, 1)#获取数组中每一行最小元素的索引,返回数组,输出如下
array([0, 0, 0], dtype=int64)
max_a01_column = np.max(a01, 0)#获取数组中每一列最大元素,返回数组,输出如下
array([ 9, 10, 11, 12])
a03 = np.argmax(a01, 0)#获取数组中每一列最大元素的索引,返回数组,输出如下
array([2, 2, 2, 2], dtype=int64)
max_a01_row = np.max(a01, 1)#获取数组中每一行最大元素,返回数组,输出如下
array([ 4, 8, 12])
a03 = np.argmax(a01, 1)#获取数组中每一行最大元素的索引,返回数组,输出如下
array([3, 3, 3], dtype=int64)
使用上述代码获取数组最大最小元素及索引时,如果数组中存在nan值,会将nan值作为最大和最小元素,如果想要忽略nan值,可以使用nanargmin、nanmin、nanargmax、nanmax函数。
五、数组其他操作
以numpy定义的数组为例。
5.1数组元素进行约分
示例代码如下:
import numpy as np
a01 = np.array([[1.4,2.5,3.5,4.6],[5.44,6.45,7.55,8.46]])#维度为2×4,输出如下
array([[1.4 , 2.5 , 3.5 , 4.6 ],
[5.44, 6.45, 7.55, 8.46]])
a02 = np.round(a01, 1)#保留一位小数进行约分,输出如下
array([[1.4, 2.5, 3.5, 4.6],
[5.4, 6.4, 7.6, 8.5]])
a02 = np.round(a01, 0)#保留整数位进行约分,输出如下
array([[1., 2., 4., 5.],
[5., 6., 8., 8.]])
从上述代码及执行结果可看出,numpy的round函数约分时满足四舍六入五看单双的规则,这一点与python的内置round函数不同,内置round函数在约分时会考虑到浮点数表示的精度问题,所以导致看上去可能不符合约分规则。想要看到浮点数的实际大小,可通过如下代码查看:
import decimal
print(decimal.Decimal(6.45))#输出如下
6.45000000000000017763568394002504646778106689453125
print(decimal.Decimal(3.125))#输出如下
3.125
5.2数组复制
数组复制,示例代码如下:
import numpy as np
a01 = np.array([1.4,2.5,3.5,4.6])#输出如下
array([1.4, 2.5, 3.5, 4.6])
a02 = a01
a03 = np.copy(a01)
a01[0] = 0#改变a01的第一个元素值后,a01、a02、a03分别如下
array([0. , 2.5, 3.5, 4.6])
array([0. , 2.5, 3.5, 4.6])
array([1.4, 2.5, 3.5, 4.6])
a02[1] = 0#改变a02的第二个元素值后,a01、a02、a03分别如下
array([0. , 0. , 3.5, 4.6])
array([0. , 0. , 3.5, 4.6])
array([1.4, 2.5, 3.5, 4.6])
a03[3] = 0#改变a03的第四个元素值后,a01、a02、a03分别如下
array([0. , 0. , 3.5, 4.6])
array([0. , 0. , 3.5, 4.6])
array([1.4, 2.5, 3.5, 0. ])
由上述代码可知,采用直接赋值的形式,新数组与原数组共享内存,改变数组内元素值后另一数组也会同步变化,使用copy函数,新数组与原数组互不影响,这一点与列表的复制相同。
参考文档
Python: NumPy中的多维数组ndarray
细说NumPy数组的四种乘法,带你走进向量运算的奇妙世界
【Python之numpy库】12.np.round() 对数组/一堆数保留n位小数
python print设置输出宽度 python输出结果宽度