有一些树上也分为三种索引方式:基本切片索引,花式索引和查找索引。
数据的索引与查找(切片索引,花式索引,查找索引)
可以对比学习一下。
现在我们来讲讲今天的主要内容。
整数索引就是对数组中的单个元素进行操作
import numpy as np
x=np.array([1,2,3,4,5,6,7,8,9])#创建一个数组
print(x[3])#第四个元素,这里[]内的数是数组的下标。
#4
切片操作是指抽取数组的一部分元素生成新数组。对 python 列表进行切片操作得到的数组是原数组的副本,而对 Numpy 数据进行切片操作得到的数组则是指向相同缓冲区的视图。当你想查找数组中的一部分元素的时候,就必须用切片索引进行操作。转化为Numpy语言就是(start:stop:step),为了更好地理解切片语法,还应该了解不明确指明起始和结束位置的情况。如省去第一个数字(:stop:step),numpy 会认为第一个数字是0;如省去第二个数字,numpy 则会认为第二个数字是数组的最大索引值(start:MAX:step);如省去最后一个数字,它将会被理解为1(start:stop:),也就是抽取所有元素而不再考虑间隔,如果是将最后一个数字变为-1,就是逆序抽取所有元素。
一维数组的索引
import numpy as np
x=np.array([1,2,3,4,5,6,7,8,9,10])#访问第六个元素
print(x[5])#访问第三个到第九个元素
print(x[2:9])#访问前五个元素
print(x[0:5])#也可以表示为
print(x[:5])#访问除了第一个之外的全部元素
print(x[:-1])#访问全部
print(x[:])#将第3-6个元素全部置换为521
x[2:6]=521
print(x[2:6])#访问全部元素(-1是从左往右访问)
print(x[::-1])
#6
#[3 4 5 6 7 8 9]
#[1 2 3 4 5]
#[1 2 3 4 5]
#[1 2 3 4 5 6 7 8 9]
#[ 1 2 3 4 5 6 7 8 9 10]
#[521 521 521 521]
#[ 10 9 8 7 521 521 521 521 2 1]
进行二维数组的切片操作(每一个维度一个索引值,然后用逗号分割)
对于二维数组,在逗号前面的(n,)意味着对二维数组的第0个维度上的第n号元素操作,在逗号后面的(,n)意味着对二维数组的第1个维度上的第n号元素进行操作,如果是(m:n,)意味着对二维数组的第0个维度上第m到n-1号元素操作。通过对每个以逗号分隔的维度执行单独的切片,你可以对多维数组进行切片。因此,对于二维数组,我们的第一片定义了行的切片,第二片定义了列的切片。
x=np.array([[1,2,3],[4,5,6],[7,8,9]])#定义一个二维数组
#返回第一行第三列第三个元素(每个维度一个索引值,用逗号分割)
print(x[2:,2:])#第三行第三列元素
print(x[::2,])#以行为操作对象,步长为二
print(x[::2,1:])#以行为操作对象,步长为二,逗号后面以咧为操作对象,从第二行到最大值
#[[9]]
#[[1 2 3][7 8 9]]
#[[2 3][8 9]]
三元数组的切片操作可以对比以为和二位的操作方式
通过判断语句对数组进行操作
import numpy as np
x = np.array([1, 2, 3, 4, 5, 6, 7, 8])
y = x > 5
print(y)
print(x[x > 5])
x = np.array([np.nan, 1, 2, np.nan, 3, 4, 5])
y = np.logical_not(np.isnan(x))
print(x[y])
x = np.array([[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]])
y = x > 10
print(y)
print(x[x > 20])
#[False False False False False True True True]
#[6 7 8]
#[1. 2. 3. 4. 5.]
#[[False False False False False]
#[False False False False False]
#[ True True True True True]
#[ True True True True True]
#[ True True True True True]]
#[21 22 23 24 25]
利用matplotlib函数输出图表
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 2 * np.pi, 50)
y = np.sin(x)
print(len(x)) # 50
plt.plot(x, y)
mask = y >= 0
print(len(x[mask])) # 25
print(mask)
'''
[ True True True True True True True True True True True True
True True True True True True True True True True True True
True False False False False False False False False False False False
False False False False False False False False False False False False
False False]
'''
plt.plot(x[mask], y[mask], 'bo')
mask = np.logical_and(y >= 0, x <= np.pi / 2)
print(mask)
'''
[ True True True True True True True True True True True True
True False False False False False False False False False False False
False False False False False False False False False False False False
False False False False False False False False False False False False
False False]
'''
plt.plot(x[mask], y[mask], 'go')
plt.show()
50
25
[ True True True True True True True True True True True True
True True True True True True True True True True True True
True False False False False False False False False False False False
False False False False False False False False False False False False
False False]
[ True True True True True True True True True True True True
True False False False False False False False False False False False
False False False False False False False False False False False False
False False False False False False False False False False False False
False False]
**
**
Numpy 允许使用 … 表示足够多的冒号来构建完整的索引列表。
假如x是4是4维数组
import numpy as np
x = np.random.randint(1, 100, [2, 2, 3])
#random.randint(参数1,参数2,参数3)
返回参数1与参数2之间的任意整数(随机产生),连续抽取size个数组,[2,2,3]的意思是分块矩阵,2个矩阵块,分别为2行3列
print(x)
print(x[1, ...])
print(x[..., 2])
#[[[41 77 24]
#[49 92 76]]
#[[88 32 41]
#[90 89 64]]]
#[[88 32 41]
#[90 89 64]]
#[[24 76]
#[41 64]
方括号内传入多个索引值,可以同时选择多个元素。
import numpy as np
x = np.array([1, 2, 3, 4, 5, 6, 7, 8])
r = [0, 1, 2]
print(x[r])
r = [0, 1, -1]
print(x[r])
#[1 2 3]
#[1 2 8]
x = np.array([[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]])
r = [0, 1, 2]
print(x[r])
#[[11 12 13 14 15][16 17 18 19 20][21 22 23 24 25]]
r = [0, 1, -1]
print(x[r])
#[[11 12 13 14 15][16 17 18 19 20][31 32 33 34 35]]
r = [0, 1, 2]
c = [2, 3, 4]
y = x[r, c]
print(y)
#[13 19 25]
当然整数数组索引也可以借助切片索引进行组合
import numpy as np
x = np.array([1, 2, 3, 4, 5, 6, 7, 8])
r = [0, 1, 2]
print(np.take(x, r))
# [1 2 3]
r = [0, 1, -1]
print(np.take(x, r))
# [1 2 8]
x = np.array([[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]])
r = [0, 1, 2]
print(np.take(x, r, axis=0))
# [[11 12 13 14 15]
# [16 17 18 19 20]
# [21 22 23 24 25]]
r = [0, 1, -1]
print(np.take(x, r, axis=0))
# [[11 12 13 14 15]
# [16 17 18 19 20]
# [31 32 33 34 35]]
r = [0, 1, 2]
c = [2, 3, 4]
y = np.take(x, [r, c])
print(y)
# [[11 12 13]
# [13 14 15]]
以上就是Numpy索引的全部内容了,欢迎大家批评指正哦,么么哒,爱你们!