一、索引、切片与迭代、遍历
(1)索引机制
数组索引是指用方括号加序号的形式引用单个数组元素。新建数组后,会自动生成和数组大小一致的索引。
同Python列表的索引相似,Numpy中的数组索引同样可以使用负数。
如若需要同时输出多个元素,可以将所需的元素索引以一个列表的形式传入。
import numpy as np
a = np.arange(10,16)
print('输出原数组元素:', a)
print('输出第三个元素:', a[2])
print('输出负一个元素:', a[-1])
print('输出多个元素 :', a[[1, 3, 4]])
输出结果如下:
输出原数组元素: [10 11 12 13 14 15]
输出第三个元素: 12
输出负一个元素: 15
输出多个元素 : [11 13 14]
二维数组又称为矩阵,矩阵是以行和列组成的矩形数组。二维数组的索引用一对值来表示: [行索引, 列索引]
import numpy as np
a = np.arange(10, 19).reshape(3, 3)
print('输出原数组元素:\n', a)
print('一行二列的元素:', a[0, 1])
输出结果如下:
输出原数组元素:
[[10 11 12]
[13 14 15]
[16 17 18]]
一行二列的元素: 11
(2)切片方法
切片操作是指抽取数组的部分元素从而生成新数组。切片的句法是通过冒号分隔切片参数 start:stop:step 来进行切片操作
- 在切片中,包含start,但不包括stop元素
- 如省略不填start参数,则默认为0
- 如省略不填stop参数,则默认为最大索引值
- 如省略不填step参数,则默认为1
- 对于二维数组,依旧需要分行和列进行切片
- 对于二维数组,若抽取的行或列的索引不连续,则可以将所需的索引以一个列表的形式传入
import numpy as np
a = np.arange(10, 16)
b = np.arange(10, 19).reshape(3, 3)
print('*'*10, '一维数组切片', '*'*10)
print('原数组:', a)
print('切片1:', a[::])
print('切片2:', a[0:5:2])
print('切片3:', a[::2])
print('*'*10, '二维数组切片', '*'*10)
print('切片1:\n', b[:2,:2])
print('切片2:\n', b[[0,2],:])
print('切片3:\n', b[0,:])
输出结果如下:
********** 一维数组切片 **********
原数组: [10 11 12 13 14 15]
切片1: [10 11 12 13 14 15]
切片2: [10 12 14]
切片3: [10 12 14]
********** 二维数组切片 **********
切片1:
[[10 11]
[13 14]]
切片2:
[[10 11 12]
[16 17 18]]
切片2:
[10 11 12]
(3)迭代方法
对Numpy数组元素的迭代可以直接使用for循环即可。所谓迭代就是依次序获取到数组中的每个元素。
import numpy as np
a = np.arange(10, 16)
b = np.arange(10, 19).reshape(3, 3)
print('*'*10, '一维数组迭代', '*'*10)
# 获取每个元素
for i in a:
print(i, end=' ')
print()
print('*'*10, '二维数组迭代', '*'*10)
print('获取每行元素')
for row in b:
print(row)
print('获取所有元素')
for i in b.flat:
print(i, end=' ')
print()
输出结果如下:
********** 一维数组迭代 **********
10 11 12 13 14 15
********** 二维数组迭代 **********
获取每行元素
[10 11 12]
[13 14 15]
[16 17 18]
获取所有元素
10 11 12 13 14 15 16 17 18
(4)遍历方法
除了采用for循环外,可以采用Numpy内置的函数**apply_along_axis()**进行按行或按列遍历操作:
- 传入的第一个参数为操作函数名,即对遍历元素进行的操作
- 传入的第二个参数axis可选值为0或1,0表示按列操作而1则是按行操作
- 传入的第三个参数arr为所遍历的数组
import numpy as np
b = np.arange(10, 19).reshape(3, 3)
# 按列求平均值
print('按列求平均:\n', np.apply_along_axis(np.mean, axis=0, arr=b))
print('按行求平均:\n', np.apply_along_axis(np.mean, axis=1, arr=b))
输出结果如下:
按列求平均:
[13. 14. 15.]
按行求平均:
[11. 14. 17.]
其中,传入的操作函数可以为自定义函数。
二、逻辑、排序
(1)逻辑判断
Numpy内置了用于逻辑判断的函数all()和any()
- all()函数用于判断数组是否所有元素都为True
- any()函数用于判断数组中是否有任一元素为True
- 返回值为布尔值
- 通常逻辑判断会与布尔运算进行配合使用。
import numpy as np
a = np.array([True, True, True])
b = np.array([True, False, True])
c = np.array([False, False, False])
print('全真数组判断是否任意为真 :', np.all(a))
print('非全真数组判断是否任意为真:', np.all(b))
print('非全真数组判断是否任一为真:', np.any(b))
print('全假数组判断是否任一为真 :', np.any(c))
输出结果如下:
全真数组判断是否任意为真 : True
非全真数组判断是否任意为真: False
非全真数组判断是否任一为真: True
全假数组判断是否任一为真 : False
(2)排序方式
在Numpy中主要用于排序的函数为sort() 和argsort()
- sort()函数返回输入数组的排序副本
- argsort()函数返回输入数组元素的索引
- 传入参数axis表示按行或按列进行排序,可选值为1(按行)或0(按列)。
直接排序的方式如下:
import numpy as np
a = np.array([
[8, 5, 6, 7],
[3, 1, 4 ,2],
])
print('直接排序(按行):\n', np.sort(a, axis=0))
print('直接排序(按行):\n', a[a.sort(axis=0)])
print('直接排序(按列):\n', np.sort(a, axis=1))
print('直接排序(按列):\n', a[a.sort(axis=1)])
输出结果如下:
直接排序(按行):
[[3 1 4 2]
[8 5 6 7]]
直接排序(按行):
[[[3 1 4 2]
[8 5 6 7]]]
直接排序(按列):
[[1 2 3 4]
[5 6 7 8]]
直接排序(按列):
[[[1 2 3 4]
[5 6 7 8]]]
根据索引进行排序的方式如下:
import numpy as np
b = np.random.randn(3,3)
print('原数组(按行) :\n', b)
print('索引排序(按行):\n', b.argsort(axis = 1))
print('索引排序(按列):\n', b.argsort(axis = 0))
print('索引排序(按行):\n', np.argsort(b, axis=1))
print('索引排序(按列):\n', np.argsort(b, axis=0))
输出的结果如下,此函数的返回值为排序元素的索引值:
原数组(按行) :
[[ 2.20612425 -0.75872485 1.03808758]
[-0.24576707 0.04071721 0.25264738]
[-0.35807198 0.51390736 0.37083124]]
索引排序(按行):
[[1 2 0]
[0 1 2]
[0 2 1]]
索引排序(按列):
[[2 0 1]
[1 1 2]
[0 2 0]]
索引排序(按行):
[[1 2 0]
[0 1 2]
[0 2 1]]
索引排序(按列):
[[2 0 1]
[1 1 2]
[0 2 0]]