python数据分析之Numpy数据库第二期数组的索引和切片的知识总结

数组的索引和切片

2.2.1数据的索引(一组数据的索引类似于python列表)

上一章节知识点通道:ndarray多维数组知识点

import numpy as np
arr = np.arange(10)
arr
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
arr[3]
3
arr[-1]
9
arr[2]=123
arr
array([  0,   1, 123,   3,   4,   5,   6,   7,   8,   9])

从代码中可以看出,数组的切片返回的是原始数组的视图。简单地说,视图就是原始数组的表现形式,切片操作并不会产生新数据,这就意味着在视图上操作都会使原数组产生变化

arr[3]=88
arr
array([  0,   1, 123,  88,   4,   5,   6,   7,   8,   9])
arr1 = arr[-3:-1] #左闭右开
arr1
array([7, 8])
arr1[:] = 77 #将上面得到的[7,8]改成[77,77]
arr
array([  0,   1, 123,  88,   4,   5,   6,  77,  77,   9])

数据的切片和索引返回都是原始数组的视图,如果需要的并非视图而是要复制数据,则通过copy方法来实现

arr
array([  0,   1, 123,  88,   4,   5,   6,  77,  77,   9])
arr1 = arr[1].copy()
arr1
1
arr1 =34
arr1
34
arr
array([  0,   1, 123,  88,   4,   5,   6,  77,  77,   9])

对于二维数组,可在单个或多个轴向上完成切片,也可以跟整数索引一起混合使用

arr = np.arange(15).reshape(3,5)
arr
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])
arr[0]
array([0, 1, 2, 3, 4])
arr[2]
array([10, 11, 12, 13, 14])

如果需要获取各个元素,可通过以下办法

arr
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])
arr[0][3]
3
arr[2,3]   #俩种办法等价
13
arr = np.arange(12).reshape(2,2,3)
arr
array([[[ 0,  1,  2],
        [ 3,  4,  5]],

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

标量值和数组都可以复制给arr[0]

old = arr[0].copy()
arr[0]= 12
arr
array([[[12, 12, 12],
        [12, 12, 12]],

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

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

同样类似于二维数组的切片,也可以索引到想要的部分元素或单个元素

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

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

数组的切片

一维数组的切片同样类似于python列表

arr = np.arange(6)
arr
array([0, 1, 2, 3, 4, 5])
arr[2:5]
array([2, 3, 4])

多维数组的切片按照轴方向进行的,当在中括号输入一个参数时,数组就会按照0州(也就是第一轴)方向进行切片

arr = np.arange(12).reshape(4,3)
arr
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11]])
arr[2:]
array([[ 6,  7,  8],
       [ 9, 10, 11]])

通过传入多个参数(可以是整数索引和切片),即可完成任意数据的获取

arr
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11]])
arr[:,1]   #参考数据合并块知识点
array([ 1,  4,  7, 10])
arr[:,1:2]  #首先0,1,2,3四行逗号隔开2列重合部分(左闭右开)
array([[ 1],
       [ 4],
       [ 7],
       [10]])
arr[2:,1:]  #首先2,3俩行接着逗号隔开1,2俩行重合部分
array([[ 7,  8],
       [10, 11]])

注意只有冒号才会选中整个表

布尔值索引

首先创建俩个数组

fruits = np.array(['apple','banana','pear','banana','pear','apple','pear'])
datas = np.random.randint(-1,1,size=(7,5))
fruits
array(['apple', 'banana', 'pear', 'banana', 'pear', 'apple', 'pear'],
      dtype='
datas
array([[ 0,  0, -1,  0,  0],
       [ 0, -1,  0, -1, -1],
       [ 0,  0,  0, -1,  0],
       [-1, -1, -1,  0,  0],
       [ 0,  0, -1, -1, -1],
       [-1,  0, -1,  0,  0],
       [ 0, -1, -1, -1, -1]])

如果每个水果对应于datas数组中的每一行,我们要取出pear对应的datas的行,这时就需要布尔选择器

fruits == 'pear'
array([False, False,  True, False,  True, False,  True])
datas[False, False,  True, False,  True, False,  True]
array([], shape=(0, 7, 5), dtype=int32)
datas[[False, False,  True, False,  True, False,  True]] #根据布尔值,取出布尔值为1的行,取1 4 7行。
array([[ 0,  0,  0, -1,  0],
       [ 0,  0, -1, -1, -1],
       [ 0, -1, -1, -1, -1]])
datas[[0, 0,  1, 0,  1, 0,  1]] #无法识别0,1
array([[ 0,  0, -1,  0,  0],
       [ 0,  0, -1,  0,  0],
       [ 0, -1,  0, -1, -1],
       [ 0,  0, -1,  0,  0],
       [ 0, -1,  0, -1, -1],
       [ 0,  0, -1,  0,  0],
       [ 0, -1,  0, -1, -1]])
datas[fruits == 'pear']  #datas取出值为真的行数
array([[ 0,  0,  0, -1,  0],
       [ 0,  0, -1, -1, -1],
       [ 0, -1, -1, -1, -1]])

注意:布尔值数组的长度必须和被索引的轴长度一致。

既然可以使用不二选者,那么也同样适用于不等号(!=)、负号(-)、和(&)、或(|)

datas[fruits != 'pear']
array([[ 0,  0, -1,  0,  0],
       [ 0, -1,  0, -1, -1],
       [-1, -1, -1,  0,  0],
       [-1,  0, -1,  0,  0]])
datas[(fruits == 'apple')|(fruits == 'banana')]
array([[ 0,  0, -1,  0,  0],
       [ 0, -1,  0, -1, -1],
       [-1, -1, -1,  0,  0],
       [-1,  0, -1,  0,  0]])

此外,布尔数组也可以结合切片和索引来使用

datas[fruits == 'pear',2:]
array([[ 0, -1,  0],
       [-1, -1, -1],
       [-1, -1, -1]])
datas[fruits == 'pear',2]
array([ 0, -1, -1])

通过以下代码可以完成datas数组中的0值替换为1值。

datas[datas == 0] = 1
datas
array([[ 1,  1, -1,  1,  1],
       [ 1, -1,  1, -1, -1],
       [ 1,  1,  1, -1,  1],
       [-1, -1, -1,  1,  1],
       [ 1,  1, -1, -1, -1],
       [-1,  1, -1,  1,  1],
       [ 1, -1, -1, -1, -1]])

花式索引

花式索引是Numpy中的术语,它可以通过整数列表或数组进行索引。

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

也可以使用np.ix_函数完成同样操作

arr[np.ix_([3,2],[2,1])]
array([[11, 10],
       [ 8,  7]])

你可能感兴趣的:(python,python,numpy,深度学习)