ndarray数组的索引和切片
索引:获取数组中特定位置元素的过程
切片:获取数组元素子集的过程
利用切片得到的数组为浅复制,即原数组改变,新的数组也会随之改变。为避免浅复制,建议使用副本切片,即copy()
import numpy as np
一维数组
一维数组的索引和切片与python中的列表类似
索引:若元素个数为n,则索引下标可表示为[0,1,2,...,n-1]或[-n,-(n-1),-(n-2),...,-2,-1]
print('*'*8+'一维数组的索引和切片'+'*'*8)
# 若元素个数为n,则索引下标可表示为[0,1,2,...,n-1]或[-n,-(n-1),-(n-2),...,-2,-1]
ar1 = np.array([5, 6, 7, 8, 9])
print(ar1[4]) # 索引自左向右从下标0开始
print(ar1[-2]) # 索引自右向左从下标-1递减,最右边为-1,相邻的为-2
切片:切片可用三元素冒号分割
ar1[起始编号 : 终止编号(不含) : 步长],起始编号默认是0,终止编号默认是n,步长默认是1
仍然是ndarray
数组
b = ar1[1:4:2]
print(b)
print(type(b))
多维数组
ar2 = np.arange(24).reshape((2, 3, 4))
print('*'*8+'多维数组的索引和切片'+'*'*8)
多维数组的索引,每个维度一个索引值,逗号分隔————r2[ax0上索引,ax1上索引,ax2上索引],各个维度索引和一维相同0~n-1
或-n~-1
print(ar2)
print(ar2[1, 1, 2])
print(ar2[-1, -2, -2])
多维数组的切片,逗号分隔,每个维度同一维切片一样,用三冒号分隔, 如果只有一个:表示选取整个维度
print(ar2[:, 1:3, :])
print(ar2[:, 1:3, ::2])
print(ar2[:, 1, -3])
索引数组:将数组作为索引,通常是一维数组(每个元素代表对应维度索引)
1.布尔索引
布尔数组:顾名思义,元素类型为布尔值的数组,同样可以是一维或者多维数组
例如:
bool_arr1 = np.array([True, False, False, False, False, False,True])
如下的数组定义也是布尔数组
names = np.array(['Liu', 'Zhang', 'Li', 'Wang', 'Sun', 'Zong', 'Kong'])
bool_arr2 = names == 'Zhang'
此时bool_arr2
为array[False True False False False False False]
若想得到bool_arr1
,则:bool_arr1 = (names == 'Liu') | (names == 'Kong')
同样的,与 &
、非 ~
、不等于 !=
、>=
、<=
、>
、<
等条件判断同样可以用于布尔数组赋值语句里。
注意!Python中的关键字and和or对布尔值数组并没有用,is在特殊情况可能会有效,即判断两个布尔数组是否相等
如:bool_arr3 = ~(names == 'Zhang')
等价于boo_arr3 = names != 'Zhang'
将一维布尔数组 作为 布尔索引数组,例如:
names = np.array(['Liu', 'Zhang', 'Li', 'Wang', 'Sun', 'Zong', 'Kong'])
bool_arr2 = names == 'Zhang'
data = np.arange(21).reshape((7,3))
print(data)
print(data[bool_arr2])
输出为:
[[ 0 1 2]
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]
[12 13 14]
[15 16 17]
[18 19 20]] # data
[[3 4 5]] # data[bool_arr2]
2.神奇索引
使用整数数组作为数据索引数组,整数数组可以是一维或多维
2.1一维数据索引数组
一维数据索引数组传递包含指定顺序的列表或数组。即:
一维数据索引数据每个元素
i
代表数组轴axis=0
上,即取第1维的第i
个数据。
例1:
data1 = np.arange(28).reshape((7, 4))
print(data1)
print('-'*20 + 'data1[[1, 5, 6, 2, 1]]' + '-'*20)
print(data1[[1, 5, 6, 2, 1]])
print('-'*20 + 'data1[[-1, 3, -2, -5, 1]]' + '-'*20)
print(data1[[-1, 3, -2, -5, 1]])
输出为:
[[ 0 1 2 3] # 0或-7
[ 4 5 6 7] # 1或-6
[ 8 9 10 11] # 2或-5
[12 13 14 15] # 3或-4
[16 17 18 19] # 4或-3
[20 21 22 23] # 5或-2
[24 25 26 27]] # 6或-1
--------------------data1[[1, 5, 6, 2, 1]]--------------------
[[ 4 5 6 7]
[20 21 22 23]
[24 25 26 27]
[ 8 9 10 11]
[ 4 5 6 7]]
--------------------data1[[-1, 3, -2, -5, 1]]--------------------
[[24 25 26 27]
[12 13 14 15]
[20 21 22 23]
[ 8 9 10 11]
[ 4 5 6 7]]
例2:
data2 = np.arange(48).reshape((4, 4, 3))
print(data2)
print('-'*20 + 'data2[[3, 0, 2, 1, 0]]' + '-'*20)
print(data2[[3, 0, 2, 1, 0]])
print('-'*20 + 'data2[[-1, -2, 1, 2]]' + '-'*20)
print(data2[[-1, -2, 1, 2]])
输出为:
[[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]] # 0或-4
[[12 13 14]
[15 16 17]
[18 19 20]
[21 22 23]] # 1或-3
[[24 25 26]
[27 28 29]
[30 31 32]
[33 34 35]] # 2或-2
[[36 37 38]
[39 40 41]
[42 43 44]
[45 46 47]]] # 3或-1
--------------------data2[[3, 0, 2, 1, 0]]--------------------
[[[36 37 38]
[39 40 41]
[42 43 44]
[45 46 47]]
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
[[24 25 26]
[27 28 29]
[30 31 32]
[33 34 35]]
[[12 13 14]
[15 16 17]
[18 19 20]
[21 22 23]]
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]]
--------------------data2[[-1, -2, 1, 2]]--------------------
[[[36 37 38]
[39 40 41]
[42 43 44]
[45 46 47]]
[[24 25 26]
[27 28 29]
[30 31 32]
[33 34 35]]
[[12 13 14]
[15 16 17]
[18 19 20]
[21 22 23]]
[[24 25 26]
[27 28 29]
[30 31 32]
[33 34 35]]]
data2
是多维数组,其在轴axis=0
共有4个数据,每个数据其实又是一个数组
2.2 多个索引数组
传递多个索引数组作为索引时,会根据每个索引数组对应元素选出一个一维数组
每个索引数组大小应相同,设为
n
数组个数应等于数据数组的维数,相当于得到n
个点的坐标,坐标分量即为数据数组对应维度。
例:
data3 = np.arange(32).reshape((8, 4))
print(data3)
print('-'*20 + 'data3[[1, 5, 7, 2], [0, 3, 1, 2]]' + '-'*20)
print(data3[[1, 5, 7, 2], [0, 3, 1, 2]])
data4 = np.arange(48).reshape((4, 4, 3))
print('-'*20 + 'data4' + '-'*40)
print(data4)
print('-'*20 + 'ddata4[[3, 3, 1, 2, 0], [2, 1, 2, 0, 3], [2, 2, 0, 2, 1]' + '-'*20)
print(data4[[3, 3, 1, 2, 0], [2, 1, 2, 0, 3], [2, 2, 0, 2, 1]])
输出为:
0 1 2 3 # “坐标”
0[[ 0 1 2 3]
1 [ 4 5 6 7]
2 [ 8 9 10 11]
3 [12 13 14 15]
4 [16 17 18 19]
5 [20 21 22 23]
6 [24 25 26 27]
7 [28 29 30 31]]
--------------------data3[[1, 5, 7, 2], [0, 3, 1, 2]]--------------------
[ 4 23 29 10]
--------------------data4----------------------------------------
[[[ 0 1 2]
[ 3 4 5] # 0(axis=0)
[ 6 7 8]
[ 9 10 11]]
[[12 13 14]
[15 16 17] # 1
[18 19 20]
[21 22 23]]
[[24 25 26]
[27 28 29] # 2
[30 31 32]
[33 34 35]]
[[36 37 38]
[39 40 41] # 3
[42 43 44]
[45 46 47]]]
--------------------ddata4[[3, 3, 1, 2, 0], [2, 1, 2, 0, 3], [2, 2, 0, 2, 1]--------------------
[44 41 18 26 10]
data3[[1, 5, 7, 2], [0, 3, 1, 2]]
即为“坐标“
为(1,0)、(5,3)、(7,1)、(2,2)
的元素被选中。
data4
是一个三维数组,在0轴上,又是一个二维数组,同理:
data4[[3, 3, 1, 2, 0], [2, 1, 2, 0, 3], [2, 2, 0, 2, 1]]
即为坐标
为(3,2,2)、(3,1,2)、(1,2,0)、(2,0,2)、(0,3,1)
的元素
2.3神奇索引发挥类似切片功能
切片是逗号分隔,在每一维上可用一维数据索引数组作为其索引
多个索引数组其实就是一种特殊的切片,每维索引都是一个一维数据索引
例:
data3 = np.arange(32).reshape((8, 4))
print(data3)
kols = data3[[1, 5, 7, 2]]
print('-'*20 + 'kols' + '-'*20)
print(kols)
print('-'*20 + 'data3[[1, 5, 7, 2]][:, [0, 3, 1, 2, 3]]' + '-'*20)
print(data3[[1, 5, 7, 2]][:, [0, 3, 1, 2, 3]])
输出为:
[[ 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]]
--------------------kols--------------------
[[ 4 5 6 7]
[20 21 22 23]
[28 29 30 31]
[ 8 9 10 11]]
--------------------data3[[1, 5, 7, 2]][:, [0, 3, 1, 2, 3]]--------------------
[[ 4 7 5 6 7]
[20 23 21 22 23]
[28 31 29 30 31]
[ 8 11 9 10 11]]
data3[[1, 5, 7, 2]][:, [0, 3, 1, 2]]
其实就是data3[[1, 5, 7, 2]]
,即kols
的切片,切片第一维取全部,即全部行。
第二维取一维数据数组[0,3,1,2]
即:
新数组第一列为kols
第一列(0)[4 20 28 8]
第二列为kols
第4列(3)[7 23 31 11]
第三列为kols
第2列(1)[5 21 29 9]
第四列为kols
第3列(2)[6 22 30 10]
第五列为kols
第4列(3)[7 23 31 11]
。
numpy.newaxis
关键字
numpy.axis
用来增加数组新维度,如数组a.shape=(d0,d1,...,dn)
,那么在其di-1和di
中间添加np.newaxis
,即第i
轴增加newaxis
,那么a.shape
\(\rightarrow\)(d0,d1,..di-1,1,di,..,dn)
例:
a = np.arange(24).reshape((2, 3, 4))
print("数组a:\n", a)
b = a[:, np.newaxis, :, :]
print("数组b:\n", b)
输出:
数组a:
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]
数组b:
[[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]]
[[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]]
b.shape = (2, 1, 3, 4)
我们经常在取数组一列或一行时,得到一个一维数组,但我们仍然希望是二维数组形式,则可以使用numpy.newaxis
关键字。
ndarray数组的索引和切片的更多相关文章
- 3.3Python数据处理篇之Numpy系列(三)---数组的索引与切片
目录 (一)数组的索引与切片 1.说明: 2.实例: (二)多维数组的索引与切片 1.说明: 2.实例: 目录: 1.一维数组的索引与切片 2.多维数组的索引与切片 (一)数组的索引与切片 1.说明: ...
- numpy数组的索引和切片
numpy数组的索引和切片 基本切片操作 >>> import numpy as np >>> arr=np.arange(10) >>> arr ...
- 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 ...
- 利用Python进行数据分析(5) NumPy基础: ndarray索引和切片
概念理解 索引即通过一个无符号整数值获取数组里的值. 切片即对数组里某个片段的描述. 一维数组 一维数组的索引 一维数组的索引和Python列表的功能类似: 一维数组的切片 一维数组的切片语法格式为a ...
- 窥探Swift之数组安全索引与数组切片
今天是元宵节,祝大家元宵节快乐!在Swift中的数组和字典中下标是非常常见的,数组可以通过索引下标进行元素的查询,字典可以通过键下标来获取相应的值.在使用数组时,一个常见的致命错误就是数组越界.如果在 ...
- numpy之索引和切片
索引和切片 一维数组 一维数组很简单,基本和列表一致. 它们的区别在于数组切片是原始数组视图(这就意味着,如果做任何修改,原始都会跟着更改). 这也意味着,如果不想更改原始数组,我们需要进行显式的复制 ...
- Numpy:索引与切片
numpy基本的索引和切片 import numpy as np arr = np.array([1,2,3,555,666,888,10]) arr array([ 1, 2, 3, 555, 66 ...
- Python开发:NumPy学习(一)ndarray数组
一.数据维度 一个数据表达一个含义,一组数据表达一个或多个含义. 数据维度概念:一组数据的组织形式,其中有一维数据.二维数据.多维数据.高维数据. 1. 一维数据 一维数据由对等关系的有序或无序数据 ...
随机推荐
- C# 使用 HttpPost 请求调用 WebService (转)
转自 https://www.cnblogs.com/Brambling/p/7266482.html 之前调用 WebService 都是直接添加服务引用,然后调用 WebService 方法的,最 ...
- flask学习笔记1.21
先新建一个文件夹 templates from flask import Flask #创建Flask应用程序实例 #需要传入__name__,作用是为了确定资源所在的路径 app = Flask( ...
- [ZJOI2019]麻将(DP+有限状态自动机)
首先只需要考虑每种牌出现的张数即可,然后判断一副牌是否能胡,可以DP一下,令f[i][j][k][0/1]表示到了第i位,用j次i-1,i,i+1和k次i,i+1,i+2,是否出现对子然后最大的面子数 ...
- day28-黏包现象
#黏包现象:信息还没接收完,下一次接收的时候一下子接收好几条黏在一起的信息. #黏包现象的原因:接收端不知道发送端发送的数据的长度.recv(字节数小了). # 第一次无法接收完就缓存起来,下一次接收 ...
- 非线程安全的HashMap 和 线程安全的ConcurrentHashMap
在平时开发中,我们经常采用HashMap来作为本地缓存的一种实现方式,将一些如系统变量等数据量比较少的参数保存在HashMap中,并将其作为单例类的一个属性.在系统运行中,使用到这些缓存数据,都可以直 ...
- web接口测试中需要注意的点
1.接口返回 数据格式是否和预期一致.例如:要求返回json格式的数据,json数据的key命名是否正确,对应的value是否与数据库一致. 需要转换的数据是否正确转换,例如时间戳是否按正确转换为时间 ...
- 吴裕雄--天生自然python学习笔记:pandas模块用 dataframe.loc 通过行、列标题读取数据
用 df.va lue s 读取数据的前提是必须知道学生及科目的位置,非常麻烦 . 而 df.loc 可直接通过行.列标题读取数据,使用起来更为方便 . 使用 df.loc 的语法为: 行标题或列标题 ...
- hashMap插入初始值
加了this. 就很容易看出来是使用了内部类和{}代码块 当然也可以把this去掉, 更简洁, 只是不能一眼看出来怎么初始化的 类似的可以做ArrayList ....的初始化
- Qt QString与string的转换
QString --> string QString.toStdString(); string --> QString QString::fromStdString(string);
- js - 常用的继承
零.序言 参考资料:JavaScript常用八种继承方案: 注:1.此篇笔记是站在上述资料的肩膀上的一篇小结: 2.阅读之前建议温习一下 js 中的 prototype 和 constructor:( ...