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])