Numpy-03对数组按索引查询

Numpy对数组按索引查询

基础索引

传入单个数字以及切片来查询数据的

神奇索引

行和列都支持数字列表的方式来进行查询

布尔索引

先进性条件判断,得到一个布尔数组,然后使用它来对原来的数据进行索引查询


三种索引方法: 基础索引 神奇索引 布尔索引

In [1]:

import numpy as np

In [2]:

# 一维向量
x = np.arange(10)
x

Out[2]:

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

In [3]:

# 二维向量,一般用大写字母
X = np.arange(20).reshape(4, 5)
X

Out[3]:

array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19]])

基础索引

一维数组

和Python的List一样

In [4]:

x

Out[4]:

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

In [5]:

print(x[2], x[4], x[-1])
2 4 9

In [6]:

x[2: 4]

Out[6]:

array([2, 3])

In [7]:

x[2: -1]

Out[7]:

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

In [8]:

x[-3: ]

Out[8]:

array([7, 8, 9])

In [9]:

x[: -3]

Out[9]:

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

二维数组

In [10]:

X

Out[10]:

array([[ 0,  1,  2,  3,  4],       [ 5,  6,  7,  8,  9],       [10, 11, 12, 13, 14],       [15, 16, 17, 18, 19]])

In [11]:

# 分别用行坐标、列坐标,实现行列筛选# X[0][0]X[0, 0]

Out[11]:

0

In [12]:

X[-1, 2]

Out[12]:

17

In [13]:

# 可以省略后续索引值,返回的数据是降低一个维度的数组# 这里的2,其实是要筛选第2行,以及所有的列X[2]

Out[13]:

array([10, 11, 12, 13, 14])

In [14]:

# 筛选-1对应的行X[: -1]

Out[14]:

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

In [15]:

# 筛选多行,然后筛选多列X[: 2, 2: 4]

Out[15]:

array([[2, 3],       [7, 8]])

In [16]:

# 筛选所有行,然后筛选多列X[:, 2]

Out[16]:

array([ 2,  7, 12, 17])
注意:切片的修改会修改原来的数组

原因:numpy经常要处理大数组,避免每次都复制

In [17]:

x

Out[17]:

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

In [18]:

x[2: 4] = 666x

Out[18]:

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

In [19]:

X[: 1, : 2] = 666X

Out[19]:

array([[666, 666,   2,   3,   4],       [  5,   6,   7,   8,   9],       [ 10,  11,  12,  13,  14],       [ 15,  16,  17,  18,  19]])

神奇索引

其实就是:用整数数组进行的索引,叫神奇索引

三维数组

In [20]:

x = np.arange(10)x

Out[20]:

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

In [21]:

x[[3, 4, 7]]

Out[21]:

array([3, 4, 7])

In [23]:

indexs = np.array([[0, 2], [1, 3]])x[indexs]

Out[23]:

array([[0, 2],       [1, 3]])
实例:获取数组中最大的前N个数组

In [25]:

# 随机生成1到100之间的,10个数字arr = np.random.randint(1, 100, 10)arr

Out[25]:

array([87, 94, 56, 28, 43, 12, 24, 72, 38, 85])

In [27]:

# arr.argsort()会返回排序后的索引index# 取最大值对应的3个下标arr.argsort()[-3:]

Out[27]:

array([9, 0, 1], dtype=int64)

In [28]:

arr[arr.argsort()[-3:]]

Out[28]:

array([85, 87, 94])

二维数组

In [29]:

X = np.arange(20).reshape(4, 5)X

Out[29]:

array([[ 0,  1,  2,  3,  4],       [ 5,  6,  7,  8,  9],       [10, 11, 12, 13, 14],       [15, 16, 17, 18, 19]])

In [30]:

# 筛选多行,列可以省略X[[0, 2]]

Out[30]:

array([[ 0,  1,  2,  3,  4],       [10, 11, 12, 13, 14]])

In [31]:

X[[0, 2], :]

Out[31]:

array([[ 0,  1,  2,  3,  4],       [10, 11, 12, 13, 14]])

In [32]:

# 筛选多列,行不能省略X[:, [0, 2, 3]]

Out[32]:

array([[ 0,  2,  3],       [ 5,  7,  8],       [10, 12, 13],       [15, 17, 18]])

In [33]:

# 同时指定行列-列表# 返回的是[(0, 1), (2, 3), (3, 4)]位置的数字X[[0, 2, 3], [1, 3, 4]]

Out[33]:

array([ 1, 13, 19])

布尔索引

常用

一维数组

In [41]:

# 将数据还原x = np.arange(10)

In [42]:

x

Out[42]:

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

In [43]:

x > 5

Out[43]:

array([False, False, False, False, False, False,  True,  True,  True,        True])

In [44]:

x[x > 5]

Out[44]:

array([6, 7, 8, 9])

In [45]:

# 实例:把一维数组进行01化处理# 比如把房价数字,变成“高房价”为1,“低房价”为0x[x <= 5] = 0x[x > 5] = 1x

Out[45]:

array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1])

In [46]:

x = np.arange(10)x[x < 5] += 20x

Out[46]:

array([20, 21, 22, 23, 24,  5,  6,  7,  8,  9])

二维数组

In [47]:

X = np.arange(20).reshape(4, 5)X

Out[47]:

array([[ 0,  1,  2,  3,  4],       [ 5,  6,  7,  8,  9],       [10, 11, 12, 13, 14],       [15, 16, 17, 18, 19]])

In [48]:

X > 5

Out[48]:

array([[False, False, False, False, False],       [False,  True,  True,  True,  True],       [ True,  True,  True,  True,  True],       [ True,  True,  True,  True,  True]])

In [49]:

# X>5的bool数组,既有行,又有列# 因此返回的是(行,列)一堆结果X[X > 5]

Out[49]:

array([ 6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19])

In [50]:

# 举例:怎样把第3列大于5的筛选出来X[:, 3]

Out[50]:

array([ 3,  8, 13, 18])

In [51]:

X[:, 3] > 5

Out[51]:

array([False,  True,  True,  True])

In [52]:

# 这里是按照进行的筛选X[X[:, 3] > 5]

Out[52]:

array([[ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19]])

In [53]:

X[X[:, 3] > 5] = 666
X

Out[53]:

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

条件的组合

In [54]:

x = np.arange(10)
x

Out[54]:

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

In [58]:

# 注意:每个条件都得加小括号
condition = (x % 2 == 0) | (x > 7)
condition

Out[58]:

array([ True, False,  True, False,  True, False,  True, False,  True,
        True])

In [59]:

x[condition]

Out[59]:

array([0, 2, 4, 6, 8, 9])
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值