数组可以通过索引或切片的方式进行访问或修改,数组切片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. 【LeetCode动态规划#09】完全背包问题实战,其二(零钱兑换和完全平方数--求物品放入个数)

    零钱兑换 力扣题目链接(opens new window) 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能 ...

  2. 【LeetCode二叉树#12】合并二叉树(巩固层序遍历)

    合并二叉树 力扣题目链接(opens new window) 给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠. 你需要将他们合并为一个新的二叉树.合并的规则是如果 ...

  3. 为产品的一堆Visual Studio解决方案引入Directory.Build.props

    为什么需要Directory.Build.props? 一个产品有了多个甚至几十个解决方案之后,每个解决方案里面的项目可能会引用一个dll包的不同版本,因此需要集中管理dll包的版本号. .NET的D ...

  4. 谈谈在incubator-dolphinscheduler 中为啥不能及时看到python任务输出的print日志

    一.incubator-dolphinscheduler 中如何获取shell类型的节点或者python类型的节点任务的日志 1.在org.apache.dolphinscheduler.server ...

  5. STL-unordered_map,unordered_set模拟实现

    unordered_set #pragma once #include"28hashtable_container.h" namespace test { //template & ...

  6. Java 常见的两个错误 -------1.栈溢出 java.lang.StackOverflowError 2.堆溢出 java.lang.OutOfMemoryError /OOM

    1 package com.bytezero.exception; 2 3 /** 4 * 5 * @Description Error 6 * @author Bytezero·zhenglei! ...

  7. TR069-STUN

    原理 1.NAT穿越技术,为了解决NAT设备对P2P网络的通信限制   2.作用:检测网络中是否存在NAT设备,并获取两个通信端点经NAT设备分配的IP地址和端口号,然后建立一条可穿越NAT的P2P链 ...

  8. aardio ide 字体 及设置

    需求 aardio ide 只支持一个字体,英文字体肯定是Fira 但是中文字体不好,所以只好将两个字体合并上使用. 有教程.但是我发现已经有合并好的,就拿来使用吧放到fonts目录里面 代码 imp ...

  9. vscode 格式化 vue 等文件的 配置 eslint vetur prettier Beautify

    需求 自动格式化需求 多行回车 合并一行,去分号 最后一个逗号,自动删除,符合eslint 结果 虽然能用了,但是 百度好几个方案,也不知道哪个对哪个,太忙没时间弄了. 配置文件记录 eslint 得 ...

  10. tp5.1 controller 名称自动转换大小写,导致文件名对不上 url_convert

    // 是否自动转换URL中的控制器和操作名 'url_convert' => false, // true,