Day02:Numpy数组的索引与切片

Numpy数组的索引
有一些树上也分为三种索引方式:基本切片索引,花式索引和查找索引。
数据的索引与查找(切片索引,花式索引,查找索引)
可以对比学习一下。
现在我们来讲讲今天的主要内容。

- 整数索引

整数索引就是对数组中的单个元素进行操作

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]

我们利用这些条件来选择图上的不同点。蓝色点(在图中还包括绿点,但绿点掩盖了蓝色点),显示值  大于0  的所有点。绿色点表示值  大于0 且 小于0.5π 的所有点。

**

dots索引

**
Numpy 允许使用 … 表示足够多的冒号来构建完整的索引列表。
假如x是4是4维数组

  1. x[1,2,…]<=>x[1,2,:,:,:]
  2. x[…,3]<=>x[:,:,:,:,3]
  3. x[4,…,5,:]<=>x[4,:,:,5,:]
    这里补充一下random.randint函数的部分知识:
    random.randint(low,high,size,dtype) rand+数据类型(返回值的数据类型)
    返回low与high之间的任意整数(随机产生),连续抽取size个数组
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个矩阵块,分别为23print(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索引的全部内容了,欢迎大家批评指正哦,么么哒,爱你们!

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值