数组可以通过索引或切片的方式进行访问或修改,数组切片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. yolov5项目cuda错误解决

    CUDA报错解决 # 报错详情 AssertionError: CUDA unavailable, invalid device 0 requested 查看cuda版本 先看一下电脑是否支持GPU, ...

  2. .NET应用国际化支持-葡萄牙语下如何不区分重音的模糊查询

    葡萄牙语,作为一种罗曼语族的语言,其正字法(orthography)并不使用音标系统来标记发音,而是有一套特定的拼写规则.然而,葡萄牙语中确实使用重音符号(acentos)来标记某些元音的重音(str ...

  3. Java 常用类 JDK 8 之前日期和时间的API测试

    1 package com.bytezero.stringclass; 2 3 import org.junit.Test; 4 5 import java.util.Date; 6 7 8 /** ...

  4. Java package(包) +import 关键字(1)

    Java 包(package) 为了更好地组织类,Java 提供了包机制,用于区别类名的命名空间. 包的作用 1.把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用. 2.如同文件夹一样, ...

  5. 动态挂载指定vue组件 Vue.extend $mount('#aaa111')

    模板中要有定位 <template> <div id="aaa111"></div> </template> 指定某个函数执行 im ...

  6. be动词 系动词 连缀动词 Linking Verb

    be动词 系动词 连缀动词 Linking Verb be 原型 am 第一人称单数形式 is 第三人称单数形式 are 第二人称单数和复数形式 been 过去分词 being 现在分词 was 第一 ...

  7. SpringBoot 学习记录 2021.05.13 Started

    环境搭建 Spring Boot 2.x Java JDK 需要安装 JDK java8 也就是 1.8, 用 jdk-8u271-windows-x64.exe 网上有很多安装java8的教程,很简 ...

  8. python中记录打印的log模块logging的用法实例

    日志基础教程   日志是对软件执行时所发生事件的一种追踪方式.软件开发人员对他们的代码添加日志调用,借此来指示某事件的发生.一个事件通过一些包含变量数据的描述信息来描述(比如:每个事件发生时的数据都是 ...

  9. 【开源库推荐】#5 Android高亮引导库

    原文:[开源库推荐]#5 Android高亮引导库 - Stars-One的杂货小窝 本文介绍2个高亮引导库HighLightPro和Curtain hyy920109/HighLightPro: A ...

  10. 快速搭建Web安全测试环境

    快速搭建Web安全测试环境 1.虚拟机安装 2.网站搭建 一.虚拟机安装 下载VMware虚拟机,Windows 虚拟机 | Workstation Pro | VMware | CN 安装VMwar ...