python多维数组索引_Numpy多维数组索引与切片详解

本文详细介绍了Numpy中多维数组的索引和切片操作,包括一维数组的索引、切片、修改,以及多维数组的索引、切片、布尔型索引和花式索引的用法。通过对示例的演示,阐述了数组切片作为原始数组视图的特点,强调了对切片的修改会直接影响原始数组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者:Zarten

简介: 互联网一线工作者,尊重原创并欢迎评论留言指出不足之处,也希望多些关注和点赞是给作者最好的鼓励 !

概述

numpy中多维数组的索引与切片跟python中的列表类似,但最大的区别是,数组切片是原始数组的视图,也就是说对视图上的修改直接会影响到原始数组,因为numpy的主要是处理大数据,如果每次切片都进行一次复制,那对性能和内存是相当大的考验。

索引及切片

1.一维数组的索引及切片

一维数组索引

这个python的列表差不多

import numpy as np

zarten = np.array([1,2,3,4,5])

print(zarten[2])

一维数组切片

import numpy as np

zarten = np.array([1,2,3,4,5])

print(zarten[1:3])

修改

对索引和切片的修改会直接映射到原数组。

下面的所有的索引和切片的修改都会映射到原数组,下面的讲解将不再阐述。

import numpy as np

zarten = np.array([1,2,3,4,5])

zarten[4] = 999

zarten[1:3] = 888

print(zarten)

2.多维数组的索引及切片

多维数组索引

多维数组索引只需由外向内逐层选取

比如:多维数组 [[1 2 3] [4 5 6] [7 8 9]]

要选取6这个数字,索引为[1][2],也可写成 [1,2]

import numpy as np

zarten = np.array([[1,2,3], [4,5,6], [7,8,9]])

print(zarten[1][2])

print(zarten[1,2])

多维数组切片

多维数组的切片就有所不同了,比如:

zarten[:2, 1:]

前面的 :2 切的是行, 1: 切的是列。行是从上到下,列是从左到右

import numpy as np

zarten = np.array([[1,2,3], [4,5,6], [7,8,9]])

print(zarten)

print('*' * 50)

print(zarten[:2, 1:])

3.布尔型索引及切片

布尔型索引

布尔型索引指的是一个布尔型ndarray数组(一般为一维)对应另一个ndarray数组的每行,布尔型数组的个数要必须与另一个多维数组的行数一致。若布尔型数组内的某个元素为True,则选取另一个多维数组的行,反之不选取。

这样说可能太抽象,下面代码说明就很好理解了。

下面代码是选取第一行和最后一行

import numpy as np

zarten = np.random.randn(5,4)

print(zarten)

print('*' * 50)

zarten_bool = np.array([True, False, False, False, True])

print(zarten[zarten_bool])

假设每一行代表一个字母的信息,分别是A B C D A

现在需要选择A字母的对应的行信息,可以看到第一行和最后一行是A字母的信息

通过比较操作可以生成关于字母A的布尔型数组

import numpy as np

zarten = np.random.randn(5,4)

print(zarten)

print('*' * 50)

zarten_1 = np.array(['A', 'B', 'C', 'D', 'A'])

print(zarten[zarten_1 == 'A'])

条件索引

上面中默认是True的就选取,False就不选取。也可以设置条件,如:

!= 不等于

& 与运算

| 或运算

!= 示例

import numpy as np

zarten = np.random.randn(5,4)

print(zarten)

print('*' * 50)

zarten_1 = np.array(['A', 'B', 'C', 'D', 'A'])

print(zarten[zarten_1 != 'A'])

& 示例

import numpy as np

zarten = np.random.randn(5,4)

print(zarten)

print('*' * 50)

zarten_1 = np.array(['A', 'B', 'C', 'D', 'A'])

cond = (zarten_1 == 'B') & (zarten_1 == 'C')

print(cond)

print(zarten[cond])

由上图可以看到 (zarten_1 == 'B') & (zarten_1 == 'C') ,两个布尔型数组&后全部为False,固没有选取任何的一行。

布尔型切片

跟多维数组的切片类似,[行, 列]第一个为行,第二个为列切片。下面代码将很好的说明

zarten = np.random.randn(5,4)

print(zarten)

print('*' * 50)

zarten_1 = np.array(['A', 'B', 'C', 'D', 'A'])

print(zarten[zarten_1 == 'A'])

print('*' * 50)

print(zarten[zarten_1 == 'A', 1:3]) #切片

4.花式索引

花式索引

花式索引跟布尔型索引类似,花式索引是可以使用整数数组进行索引,可以选取任意的行,跟布尔型索引的[True, False , False]类似,可以任意选取。花式索引更方便些。

注意:花式索引是传入整数数组。若为负数,将从末尾开始选取

例如现在选取第一行和第二行。下面将布尔型索引和花式索引做一个对比

import numpy as np

zarten = np.random.randn(5,4)

print(zarten)

print('*' * 50)

#选取第一行和第二行

#布尔型索引做法

zarten_bool = np.array([True, True, False, False, False])

print(zarten[zarten_bool])

print('*' * 50)

#花式索引做法

print(zarten[[0, 1]])

花式切片

跟上面的类似,看代码一目了然

import numpy as np

zarten = np.random.randn(5,4)

print(zarten)

print('*' * 50)

#选取第一行和第二行

#布尔型索引做法

zarten_bool = np.array([True, True, False, False, False])

print(zarten[zarten_bool])

print('*' * 50)

#花式索引做法

print(zarten[[0, 1], 1:3])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值