5、numpy——切片和索引

 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
原文地址:https://www.cnblogs.com/weststar/p/11573141.html