Numpy数组索引和切片
数组可以通过索引或切片的方式进行访问或修改,数组切片x[start:stop:step],与Ptyhon内置的list标准索引和切片类似,只是数组产生的是一个非副本视图,根据条件索引的值如果修改,直接在原数组上修改,不另建立副本
一般索引
In [1]: import numpy as np
In [2]: x = np.arange(10)
In [3]: x
Out[3]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
#获取索引值为0的元素
In [4]: x[0]
Out[4]: 0
#获取索引值为2的元素
In [5]: x[2]
Out[5]: 2
#获取前5个元素
In [6]: x[:5]
Out[6]: array([0, 1, 2, 3, 4])
#获取索引5之后的元素
In [7]: x[5:]
Out[7]: array([5, 6, 7, 8, 9])
#获取索引[4,7)之间的元素
In [8]: x[4:7]
Out[8]: array([4, 5, 6])
#每隔一个元素获取,步长为2
In [9]: x[::2]
Out[9]: array([0, 2, 4, 6, 8])
#从索引1开始每隔一个元素获取,步长为2
In [10]: x[1::2]
Out[10]: array([1, 3, 5, 7, 9])
#获取所有元素
In [11]: x[:]
Out[11]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
#获取所有元素,步长为-1(负号表示逆序)
In [12]: x[::-1]
Out[12]: array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
#从索引5开始每隔一个元素获取,步长为-2(负号表示逆序)
In [13]: x[5::-2]
Out[13]: array([5, 3, 1])
布尔索引(Boolean Indexing)
利用布尔数组作为索引。
In [1]: import numpy as np
In [2]: names = np.array(['Bob','Joe','Will','Bob','Will','Joe','Joe'])
# Return a sample (or samples) from the "standard normal" distribution.
In [3]: data = np.random.randn(7,4)
# names 为用于做布尔索引的数组
In [4]: names
Out[4]: array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'], dtype='<U4')
# data 为用于索引的数组7*4
In [5]: data
Out[5]:
array([[ 0.25289291, -0.00816246, -0.96999809, 1.29376934],
[ 0.44550485, -0.68194628, 1.14512874, -0.29373544],
[ 0.40232255, -0.00788444, 0.63469223, -0.20523947],
[ 0.74526848, -0.72704461, -0.50133668, 0.40030561],
[ 0.54539544, -0.93755557, 0.0147922 , -1.6301914 ],
[ 1.59887252, 0.79954153, -0.48389643, -1.11492092],
[-0.93389025, 0.36513027, -0.49868663, 0.67454948]])
# 创建一个names == 'Bob' 真值数组用于索引data
In [7]: names == 'Bob'
Out[7]: array([ True, False, False, True, False, False, False])
# data数组的行与names数组元素一一对应,当条件names=='Bob'=True则返回相应行数组
In [8]: data[names=='Bob']
Out[8]:
array([[ 0.25289291, -0.00816246, -0.96999809, 1.29376934],
[ 0.74526848, -0.72704461, -0.50133668, 0.40030561]])
# data数组的行与names数组元素一一对应,当条件names=='Bob'=True则返回相应行数组,1:用于切割列数据
In [9]: data[names == 'Bob', 1:]
Out[9]:
array([[-0.00816246, -0.96999809, 1.29376934],
[-0.72704461, -0.50133668, 0.40030561]])
# data数组的行与names数组元素一一对应,当条件names=='Bob'=True则返回相应行数组,1用于切割得到第一列数据
In [10]: data[names == 'Bob', 1]
Out[10]: array([-0.00816246, -0.72704461])
# != 和 ~ 用于取非值
In [11]: data[names != 'Bob']
Out[11]:
array([[ 0.44550485, -0.68194628, 1.14512874, -0.29373544],
[ 0.40232255, -0.00788444, 0.63469223, -0.20523947],
[ 0.54539544, -0.93755557, 0.0147922 , -1.6301914 ],
[ 1.59887252, 0.79954153, -0.48389643, -1.11492092],
[-0.93389025, 0.36513027, -0.49868663, 0.67454948]])
In [12]: data[~(names == 'Bob')]
Out[12]:
array([[ 0.44550485, -0.68194628, 1.14512874, -0.29373544],
[ 0.40232255, -0.00788444, 0.63469223, -0.20523947],
[ 0.54539544, -0.93755557, 0.0147922 , -1.6301914 ],
[ 1.59887252, 0.79954153, -0.48389643, -1.11492092],
[-0.93389025, 0.36513027, -0.49868663, 0.67454948]])
# and / or 表示整个数组对象的与和或,而&和|对一个对象的内容(单个比特或字节)执行多个布尔运算,因此只能用& / | 表示数组内容的与和或
In [13]: data[(names == 'Bob') | (names == 'Will')]
Out[13]:
array([[ 0.25289291, -0.00816246, -0.96999809, 1.29376934],
[ 0.40232255, -0.00788444, 0.63469223, -0.20523947],
[ 0.74526848, -0.72704461, -0.50133668, 0.40030561],
[ 0.54539544, -0.93755557, 0.0147922 , -1.6301914 ]])
# 根据data[条件] 修改值,直接在原数组上修改,不另建立副本
In [14]: data
Out[14]:
array([[ 0.25289291, -0.00816246, -0.96999809, 1.29376934],
[ 0.44550485, -0.68194628, 1.14512874, -0.29373544],
[ 0.40232255, -0.00788444, 0.63469223, -0.20523947],
[ 0.74526848, -0.72704461, -0.50133668, 0.40030561],
[ 0.54539544, -0.93755557, 0.0147922 , -1.6301914 ],
[ 1.59887252, 0.79954153, -0.48389643, -1.11492092],
[-0.93389025, 0.36513027, -0.49868663, 0.67454948]])
#把 data < 0 的值修改为 0
In [15]: data[data < 0] = 0
In [16]: data
Out[16]:
array([[0.25289291, 0. , 0. , 1.29376934],
[0.44550485, 0. , 1.14512874, 0. ],
[0.40232255, 0. , 0.63469223, 0. ],
[0.74526848, 0. , 0. , 0.40030561],
[0.54539544, 0. , 0.0147922 , 0. ],
[1.59887252, 0.79954153, 0. , 0. ],
[0. , 0.36513027, 0. , 0.67454948]])
#把 names != 'Joe' 的行值都修改为 7
In [17]: names
Out[17]: array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'], dtype='<U4')
In [18]: data[names != 'Joe'] = 7
In [19]: data
Out[19]:
array([[7. , 7. , 7. , 7. ],
[0.44550485, 0. , 1.14512874, 0. ],
[7. , 7. , 7. , 7. ],
[7. , 7. , 7. , 7. ],
[7. , 7. , 7. , 7. ],
[1.59887252, 0.79954153, 0. , 0. ],
[0. , 0.36513027, 0. , 0.67454948]])
花哨索引(Fancy Indexing)
传递一个索引数组或切片形式进行索引。
In [1]: import numpy as np
#创建一个空数组
In [2]: arr = np.empty((8,4))
In [3]: arr
Out[3]:
array([[2.59345432e+161, 1.68813881e+195, 6.01347002e-154,
6.01347002e-154],
[6.01347002e-154, 8.90389719e+252, 1.96086583e+243,
1.75631032e-152],
[5.49257737e+241, 1.08298236e-153, 4.78210140e+180,
6.01347002e-154],
[6.01347002e-154, 9.77795611e+024, 2.32160957e-152,
4.83245960e+276],
[3.09394663e+169, 9.08367217e+223, 5.56218818e+180,
6.79031368e+199],
[6.01347002e-154, 6.01347002e-154, 6.01347002e-154,
7.22247388e+159],
[4.89915603e+252, 8.88968974e+228, 2.52303419e-258,
7.49232572e+247],
[6.01347002e-154, 6.01347002e-154, 2.47379808e-091,
1.95132487e+227]])
# 往数组填充数据
In [4]: for i in range(8):
...: arr[i] = i
...:
In [5]: arr
Out[5]:
array([[0., 0., 0., 0.],
[1., 1., 1., 1.],
[2., 2., 2., 2.],
[3., 3., 3., 3.],
[4., 4., 4., 4.],
[5., 5., 5., 5.],
[6., 6., 6., 6.],
[7., 7., 7., 7.]])
# 选取数组索引为2、4、6的行
In [7]: arr[[2,4,6]]
Out[7]:
array([[2., 2., 2., 2.],
[4., 4., 4., 4.],
[6., 6., 6., 6.]])
# 选取数组索引为-1、-2、-8的行
In [8]: arr[[-1,-2,-8]]
Out[8]:
array([[7., 7., 7., 7.],
[6., 6., 6., 6.],
[0., 0., 0., 0.]])
# 从0~32中生成一个8*4的数组
In [9]: arr = np.arange(32).reshape((8,4))
In [10]: arr
Out[10]:
array([[ 0, 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, 26, 27],
[28, 29, 30, 31]])
#[3,4,6]表示行索引,[1,2,1]表示列索引,返回(行,列)为(3,1),(4,2),(6,1)位置的数
In [11]: arr[[3,5,6],[1,2,1]]
Out[11]: array([13, 22, 25])
#[1,4,6]表示行索引,冒号(:)表示该行所有的数,[0,3,2,1]表示列排序-索引1的列与3的列对换
In [15]: arr[[1,4,6]][:,[0,3,2,1]]
Out[15]:
array([[ 4, 7, 6, 5],
[16, 19, 18, 17],
[24, 27, 26, 25]])
#利用花哨索引修改值
In [20]: x = np.arange(10)
In [21]: x
Out[21]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
#创建一个花哨索引数组
In [22]: i = np.array([0,2,4,6,8])
In [23]: x[i] = x[i]*2
In [24]: x
Out[24]: array([ 0, 1, 4, 3, 8, 5, 12, 7, 16, 9])
#实现累加
In [25]: x = np.zeros(10)
In [26]: i = np.array([1,3,5,7,9])
In [27]: np.add.at(x,i,1)
In [28]: x
Out[28]: array([0., 1., 0., 1., 0., 1., 0., 1., 0., 1.])
#j=[1,3,3,7,7]分别实现索引1累加1次,索引3累加2次,索引7累加2次
In [29]: j = np.array([1,3,3,7,7])
In [30]: np.add.at(x,j,1)
In [31]: x
Out[31]: array([0., 2., 0., 3., 0., 1., 0., 3., 0., 1.])
Numpy数组索引和切片的更多相关文章
- NumPy学习(索引和切片,合并,分割,copy与deep copy)
NumPy学习(索引和切片,合并,分割,copy与deep copy) 目录 索引和切片 合并 分割 copy与deep copy 索引和切片 通过索引和切片可以访问以及修改数组元素的值 一维数组 程 ...
- numpy - 数组索引
numpy 数组索引 一.单个元素索引 一维数组索引 >>> x = np.arange(10) >>> x[2] 2 >>> x[-2] 8 二 ...
- Numpy入门(二):Numpy数组索引切片和运算
在Numpy中建立了数组或者矩阵后,需要访问数组里的成员,改变元素,并对数组进行切分和计算. 索引和切片 Numpy数组的访问模式和python中的list相似,在多维的数组中使用, 进行区分: 在p ...
- numpy之索引和切片
索引和切片 一维数组 一维数组很简单,基本和列表一致. 它们的区别在于数组切片是原始数组视图(这就意味着,如果做任何修改,原始都会跟着更改). 这也意味着,如果不想更改原始数组,我们需要进行显式的复制 ...
- Numpy数组索引为-1和None
numpy的数组操作方便,可以用:来切片,用布尔数组或者布尔表达式来查找符合条件的数据,也可以用数组作为另一个数组的索引来查找指定的数据.但有时也会见到数组索引为-1和None.两者的用法如下: 1. ...
- Numpy:索引与切片
numpy基本的索引和切片 import numpy as np arr = np.array([1,2,3,555,666,888,10]) arr array([ 1, 2, 3, 555, 66 ...
- numpy 数组索引数组
在numpy中,数组除了可以被整数索引,还可以被数组索引. a[b]就是已数组b的元素为索引,读取数组a的值. 当被索引数组a是一维数组,b是一维或则多维数组时,结果维度维度与索引数组b相同. a = ...
- Numpy学习二:数组的索引与切片
1.一维数组索引与切片#创建一维数组arr1d = np.arange(10)print(arr1d) 结果:[0 1 2 3 4 5 6 7 8 9] #数组的索引从0开始,通过索引获取第三个元素a ...
- Numpy 索引及切片
1.一维数组的索引及切片 ar = np.arange(20) print(ar) print(ar[4]) print(ar[3:6]) print(ar[:4:2]) #索引到4 按2的步长 pr ...
- Numpy数组计算
NumPy是高性能科学计算和数据分析的基础包.它是pandas等其他各种工具的基础. NumPy的主要功能 ndarray,一个多维数组结构,高效且节省空间 无需循环对整组数据进行快速运算的数学函数 ...
随机推荐
- 如何创建自己的Spring Boot Starter并为其编写单元测试
当我们想要封装一些自定义功能给别人使用的时候,创建Spring Boot Starter的形式是最好的实现方式.如果您还不会构建自己的Spring Boot Starter的话,本文将带你一起创建一个 ...
- FROM_UNIXTIME函数格式化时间戳日期类型
select FROM_UNIXTIME(bce.daysec_time/1000,'%Y-%m-%d %h:%i:%s') ,bce.* from biz_cvent bce where bce.d ...
- 【Azure 事件中心】Azure Event Hub客户端遇见 Expired Heartbeat 错误
问题描述 Azure Event Hub 在消费数端中,经常性遇见 Expired Heartbeat 错误 (consumer-xxxxxxxxxxxxx-c84873c6c828e8df6c843 ...
- 【Azure Developer】Azure REST API: 如何通过 API查看 Recovery Services Vaults(恢复保管库)的备份策略信息? 如备份中是否含有虚拟机的Disk
问题描述 如何通过 API查看 Recovery Services Vaults(恢复保管库)的备份策略信息? 如备份中是否含有虚拟机的Disk.在Azure门户中可以通过查看Backup Item查 ...
- 隐私计算在释放万亿美元 SaaS 市场的重要作用
PrimiHub一款由密码学专家团队打造的开源隐私计算平台,专注于分享数据安全.密码学.联邦学习.同态加密等隐私计算领域的技术和内容. 过去十年间数字领域经历了一场颠覆性的转变.这一演变的前沿是软件即 ...
- .net中最简单的http请求调用(比如调用chatgpt的openAI接口)
支持.Net Core(2.0及以上)/.Net Framework(4.5及以上),可以部署在Docker, Windows, Linux, Mac. http请求调用是开发中经常会用到的功能,因为 ...
- Oracle中表字段有使用Oracle关键字的一定要趁早改!!!
一.问题由来 现在进行项目改造,数据库需要迁移,由原来的使用GBase数据库改为使用Oracle数据库,今天测试人员在测试时后台报了一个异常. 把SQL语句单独复制出来进行查询,还是报错,仔细分析原因 ...
- import.meta.globEager('./src/components/**/*.vue'); 遍历文件
main.js const importAll = (modules) => { Object.keys(modules).forEach((key) => { const compone ...
- 玩转Vue3之shallowRef和shallowReactive
前言 Vue3 作为一款现代的 JavaScript 框架,引入了许多新的特性和改进,其中包括 shallowRef 和 shallowReactive.这两个功能在Vue 3中提供了更加灵活和高效的 ...
- stream使用汇总
整理了下java使用stream处理list的几个便捷的方法 准备数据 List<KnowledgeInfoTable> knowledgeInfoTables = knowledgeIn ...