[Python Cookbook] Numpy Array Slicing and Indexing

1-D Array

Indexing

Use bracket notation [ ] to get the value at a specific index. Remember that indexing starts at 0.

1 import numpy as np
2 a=np.arange(12)
3 a
4 # start from index 0
5 a[0]
6 # the last element
7 a[-1]

Output:

array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])

0

11

 

Slicing

Use : to indicate a range. 

array[start:stop] 

A second : can be used to indicate step-size. 

array[start:stop:stepsize]

Leaving start or stop empty will default to the beginning/end of the array.

1 a[1:4]
2 a[-4:]
3 a[-5::-2] #starting 5th element from the end, and counting backwards by 2 until the beginning of the array is reached

Output:

array([1, 2, 3, 4])

array([ 8,  9, 10, 11])

array([7, 5, 3, 1])

 

Multidimensional Array

1 r = np.arange(36)
2 r.resize((6, 6))
3 r

Output:

array([[ 0,  1,  2,  3,  4,  5],

       [ 6,  7,  8,  9, 10, 11],

       [12, 13, 14, 15, 16, 17],

       [18, 19, 20, 21, 22, 23],

       [24, 25, 26, 27, 28, 29],

       [30, 31, 32, 33, 34, 35]])

Use bracket notation to index: 

array[row, column] 

and use : to select a range of rows or columns

1 r[2, 2]
2 r[3, 3:6]
3 r[:2, :-1]#selecting all the rows up to (and not including) row 2, and all the columns up to (and not including) the last column
4 r[-1, ::2]#selecting the last row, and only every other element

Output:

14

array([21, 22, 23])

array([[ 0,  1,  2,  3,  4],

       [ 6,  7,  8,  9, 10]])

array([30, 32, 34])

 

We can also select nonadjacent elements by

r[[2,3],[4,5]] 

Output:

array([16, 23])

Conditional Indexing

r[r > 30]

Output:

array([31, 32, 33, 34, 35])

 

Note that if you change some elements in the slice of an array, the original array will also be change. You can see the following example:

1 r2 = r[:3,:3]
2 print(r2)
3 print(r)
4 r2[:] = 0
5 print(r2)
6 print(r)

Output:

[[ 0  1  2]

 [ 6  7  8]

 [12 13 14]]

 

[[ 0  1  2  3  4  5]

 [ 6  7  8  9 10 11]

 [12 13 14 15 16 17]

 [18 19 20 21 22 23]

 [24 25 26 27 28 29]

 [30 31 32 33 34 35]]

 

[[0 0 0]

 [0 0 0]

 [0 0 0]]

 

[[ 0  0  0  3  4  5]

 [ 0  0  0  9 10 11]

 [ 0  0  0 15 16 17]

 [18 19 20 21 22 23]

 [24 25 26 27 28 29]

 [30 31 32 33 34 35]]

To avoid this, use r.copy to create a copy that will not affect the original array.

1 r_copy = r.copy()
2 print(r_copy, '\n')
3 r_copy[:] = 10
4 print(r_copy, '\n')
5 print(r)

Output:

[[ 0  0  0  3  4  5]

 [ 0  0  0  9 10 11]

 [ 0  0  0 15 16 17]

 [18 19 20 21 22 23]

 [24 25 26 27 28 29]

 [30 31 32 33 34 35]] 

 

[[10 10 10 10 10 10]

 [10 10 10 10 10 10]

 [10 10 10 10 10 10]

 [10 10 10 10 10 10]

 [10 10 10 10 10 10]

 [10 10 10 10 10 10]] 

 

[[ 0  0  0  3  4  5]

 [ 0  0  0  9 10 11]

 [ 0  0  0 15 16 17]

 [18 19 20 21 22 23]

 [24 25 26 27 28 29]

 [30 31 32 33 34 35]]

posted @ 2019-01-05 03:23  Sherrrry  阅读(264)  评论(0编辑  收藏  举报