1、一维数组
1.1 一维数组很简单,基本和列表一致。ndarray 数组可以基于 0 - n 的下标进行索引。
切片对象可以通过内置的 slice 函数,并设置 start, stop 及 step 参数进行,从原数组中切割出一个新数组。
通过冒号分隔切片参数 start:stop:step 来进行切片操作:
1 import numpy as np 2 arr = np.arange(10) #类似于list的range() 3 # 通过内置函数slice切片 4 s = slice(2, 10, 2) 5 print(arr[s]) 6 # 通过冒号切片参数直接切片 7 print(arr[2:10:2])
结果:
[2 4 6 8]
[2 4 6 8]
2.2 冒号 : 的解释:
如果只放置一个参数,如 [2],将返回与该索引相对应的单个元素。如果为 [2:],表示从该索引开始以后的所有项都将被提取。如果使用了两个参数,如 [2:7],那么则提取两个索引(不包括停止索引)之间的项。
1 >>> import numpy as np 2 >>> a = np.arange(10) 3 >>> a 4 array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 5 >>> a[5] 6 5 7 >>> a[5:] 8 array([5, 6, 7, 8, 9]) 9 >>> a[2:6] 10 array([2, 3, 4, 5]) 11 >>>
2.3 列表切片与数组ndarray切片的区别
区别在于数组切片是原始数组视图(这就意味着,如果做任何修改,原始都会跟着更改)。这也意味着,如果不想更改原始数组,我们需要进行显式的复制,从而得到它的副本(.copy())。
1 import numpy as np 2 arr_old = arr.copy() 3 arr[0:6] = 2 4 print('arr={} arr_old={}'.format(arr,arr_old))
结果:
arr=[2 2 2 2 2 2 6 7 8 9]
arr_old=[0 1 2 3 4 5 6 7 8 9]
2、二维数组
二维数组中,各索引位置上的元素不再是标量,而是一维数组
1 import numpy as np 2 arr = np.array([[1, 2, 2], [4, 5, 6], [7, 8, 9]]) 3 print(arr, ' ', arr[1][2])
结果:
[[1 2 2] [4 5 6] [7 8 9]] 6
咱们当做一个平面直角坐标系。
相当于arr1[x,y],x相当于行数,y相当于列数(必须声明,图中x和y标反了,但不影响理解)。
3、多维数组
先说明下reshape()更改形状:
np.reshape(a,newshape,order='C')
a:array_like以一个数组为参数。
newshape:intortupleofints。整数或者元组
顺便说明下,np.reshape()不更改原数组形状(会生成一个副本)。
1 import numpy as np 2 arr1 = np.arange(1, 13) 3 arr2 = arr1.reshape(2, 2, 3) 4 print(arr1, arr2)
结果:
[ 1 2 3 4 5 6 7 8 9 10 11 12] [[[ 1 2 3] [ 4 5 6]] [[ 7 8 9] [10 11 12]]]
其实多维数组就相当于:
row * col * 列中列
import numpy as np arr1 = np.arange(1, 13) arr2 = arr1.reshape(2, 2, 3) print(arr2[1][1]) print(arr2[1][1][0])
结果:
[10 11 12]
10