numpy array索引和切片

一维数组

一维数组很简单,基本和列表一致。
它们的区别在于数组切片是原始数组视图。(这就意味着,如果做任何修改,原始都会跟着修改。)
这也意味着,如果不想更改原始数组,我们需要进行显式的复制,从而得到它的副本。(.copy()

import numpy as np

arr = np.arange( 10)
arr

输出:

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

arr[4] # 索引(注意是从0开始的)

输出:

4

arr[3:6]

输出:

array([3, 4, 5])

arr_old = arr.copy()
arr_old

输出:

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

arr[3:6] = 33
arr

输出:

array([ 0,  1,  2, 33, 33, 33,  6,  7,  8,  9])

arr_old

输出:

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

二维数组

二维数组中,各个索引位置上的元素不再是标量,而是一维数组。

arr1 = np.array([[1, 2, 3],[4, 5, 6],[7, 8, 9]])

arr1[0]
Out[13]: array([1, 2, 3])

arr1[1,2]
Out[14]: 6

多维数组

先说下reshape()更改形状:

np.reshape(a, newshape, order='C')

np.reshape()不更改原数组形状(会生成一个副本)

arr1 = np.arange(12)
arr2 = arr1.reshape(2,2,3) #将arr1变为2×2×3数组

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

arr2[1]
Out[11]: 
array([[ 6,  7,  8],
       [ 9, 10, 11]])

arr2[0,1]
Out[12]: array([3, 4, 5])

arr2[0] = 23 #赋值
arr2
Out[15]: 
array([[[23, 23, 23],
        [23, 23, 23]],
       [[ 6,  7,  8],
        [ 9, 10, 11]]])

切片索引

那么也就可以很容易的理解下面这种索引了。
切片的索引把每一行每一列当作一个列表就可以很容易的理解。返回的都是数组。

再复杂一点:
我们想要获得下面这个数组第一行的第2,3个数值。

arr1 = np.arange(36)#创建一个一维数组。

arr2 = arr1.reshape(6,6) #更改数组形状。
Out[20]: 
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]])

为了得到第2,3个数, 我们可以:

arr2[0,2:4]
Out[29]: array([2, 3])

我们还可以这样:

arr2[1] #取得第2行
Out[37]: array([ 6,  7,  8,  9, 10, 11])

arr2[:,3] #取得第3列, 只有:代表选取整列(也就是整个轴)
Out[38]: array([ 3,  9, 15, 21, 27, 33])

arr2[1:4,2:4] # 取得一个二维数组
Out[40]: 
array([[ 8,  9],
       [14, 15],
       [20, 21]])

arr2[::2,::2] #设置步长为2
Out[41]: 
array([[ 0,  2,  4],
       [12, 14, 16],
       [24, 26, 28]])

arr3 = arr2.reshape(4,3,3)

arr3[2:,:1] = 22 #对切片表达式赋值

arr3
Out[25]: 
array([[[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8]],

       [[ 9, 10, 11],
        [12, 13, 14],
        [15, 16, 17]],

       [[22, 22, 22],
        [21, 22, 23],
        [24, 25, 26]],

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

Reference:
https://www.cnblogs.com/sunshinewang/p/6882031.html

展开阅读全文

没有更多推荐了,返回首页