数组可以通过索引或切片的方式进行访问或修改,数组切片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数组索引和切片的更多相关文章

  1. NumPy学习(索引和切片,合并,分割,copy与deep copy)

    NumPy学习(索引和切片,合并,分割,copy与deep copy) 目录 索引和切片 合并 分割 copy与deep copy 索引和切片 通过索引和切片可以访问以及修改数组元素的值 一维数组 程 ...

  2. numpy - 数组索引

    numpy 数组索引 一.单个元素索引 一维数组索引 >>> x = np.arange(10) >>> x[2] 2 >>> x[-2] 8 二 ...

  3. Numpy入门(二):Numpy数组索引切片和运算

    在Numpy中建立了数组或者矩阵后,需要访问数组里的成员,改变元素,并对数组进行切分和计算. 索引和切片 Numpy数组的访问模式和python中的list相似,在多维的数组中使用, 进行区分: 在p ...

  4. numpy之索引和切片

    索引和切片 一维数组 一维数组很简单,基本和列表一致. 它们的区别在于数组切片是原始数组视图(这就意味着,如果做任何修改,原始都会跟着更改). 这也意味着,如果不想更改原始数组,我们需要进行显式的复制 ...

  5. Numpy数组索引为-1和None

    numpy的数组操作方便,可以用:来切片,用布尔数组或者布尔表达式来查找符合条件的数据,也可以用数组作为另一个数组的索引来查找指定的数据.但有时也会见到数组索引为-1和None.两者的用法如下: 1. ...

  6. Numpy:索引与切片

    numpy基本的索引和切片 import numpy as np arr = np.array([1,2,3,555,666,888,10]) arr array([ 1, 2, 3, 555, 66 ...

  7. numpy 数组索引数组

    在numpy中,数组除了可以被整数索引,还可以被数组索引. a[b]就是已数组b的元素为索引,读取数组a的值. 当被索引数组a是一维数组,b是一维或则多维数组时,结果维度维度与索引数组b相同. a = ...

  8. Numpy学习二:数组的索引与切片

    1.一维数组索引与切片#创建一维数组arr1d = np.arange(10)print(arr1d) 结果:[0 1 2 3 4 5 6 7 8 9] #数组的索引从0开始,通过索引获取第三个元素a ...

  9. Numpy 索引及切片

    1.一维数组的索引及切片 ar = np.arange(20) print(ar) print(ar[4]) print(ar[3:6]) print(ar[:4:2]) #索引到4 按2的步长 pr ...

  10. Numpy数组计算

    NumPy是高性能科学计算和数据分析的基础包.它是pandas等其他各种工具的基础. NumPy的主要功能 ndarray,一个多维数组结构,高效且节省空间 无需循环对整组数据进行快速运算的数学函数 ...

随机推荐

  1. 目标检测 - VOC - xml标注格式

    目标检测 - VOC - xml标注格式 相对其他计算机视觉任务,目标检测算法的数据格式更为复杂.为了对数据进行统一的处理,目标检测数据一般都会做成VOC或者COCO的格式. XML标注格式 < ...

  2. 【Azure 应用服务】Web App Service 中的 应用程序配置(Application Setting) 怎么获取key vault中的值

    问题描述 App Service中,如何通过 Application Setting 来配置 Key Vault中的值呢? 问题解答 首先,App Service服务可以直接通过引用的方式,无需代码的 ...

  3. Choreographer原理

    Android 系统在 VSYNC 信号的指引下,有条不紊地进行者每一帧的渲染.合成操作,使我们可以享受稳定帧率的画面.引入 VSYNC 之前的 Android 版本,渲染一帧相关的 Message ...

  4. 【转载】Java并发之AQS详解

    一.概述 谈到并发,不得不谈ReentrantLock:而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)! 类如其名,抽象的队列式的同步器,AQ ...

  5. Lua中pair和ipair的区别

    Lua中pair和ipair的区别? 二者都是Lua中内置的迭代器,可以对数组或table进行遍历. 在正常的数组或table的遍历中,二者没有区别. tableNormal={"this& ...

  6. spirmmvc框架整合手抄版示例,供基础搭建代码对照

    注明所有文档和图片完整对照,辟免笔记出错,不能复习   package com.ithm.config; import com.alibaba.druid.pool.DruidDataSource; ...

  7. 脑电测量ADS1299芯片调试总结

    问题一:读出来ID不对? 笔者经过查阅官网资料和测试,发现这个一般是上电或者启动次序不对引起的. 特别是上电次序不同会导致这类问题. 问题二:内部时钟和外部时钟的选择是什么? 就拿内部时钟来说吧,首先 ...

  8. 基于BES2500芯片的低功耗蓝牙BLE游戏手柄解决方案源码解析

    一 往事    寒冬腊月,在一个寂静的天空飘着碎银雪花的夜晚.我接到这么一个电话:"朋友,能否帮忙开发一个游戏手柄的案子?我们遇到了一些问题,迟迟无法解决.",喔,这边我陷入了沉思 ...

  9. day34-IO流01

    IO流01 1.文件基础知识 什么是文件? 文件,我们并不陌生.文件是保存数据的地方.比如大家经常使用的word文档,txt文件,excel文件等,都是文件.它既可以保存一张图片,也可以保存声音.视频 ...

  10. 基于R语言的raster包读取遥感影像

      本文介绍基于R语言中的raster包,读取单张或批量读取多张栅格图像,并对栅格图像数据加以基本处理的方法. 1 包的安装与导入   首先,我们需要配置好对应的R语言包:前面也提到,我们这里选择基于 ...