numpy数组的索引和切片
numpy数组的索引和切片
基本切片操作
>>> import numpy as np
>>> arr=np.arange(10)
>>> arr
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> arr[5]
5
>>> arr[5:8]
array([5, 6, 7])
切片赋值操作
1.切片赋一个值对应原来数组中的值也会变
>>> arr[5:8]=12
>>> arr
array([ 0, 1, 2, 3, 4, 12, 12, 12, 8, 9])
>>> import numpy as np
>>> arr=np.arange(10)
>>> arr_slice=arr[5:8]
>>> arr_slice[0]=-1
>>> arr_slice
array([-1, 6, 7])
>>> arr
array([ 0, 1, 2, 3, 4, -1, 6, 7, 8, 9])
2.给数组中所有元素赋值
>>> arr[:]=-1
>>> arr
array([-1, -1, -1, -1, -1, -1, -1, -1, -1, -1])
3.如果想使用复制的方法,使用copy方法
>>> arr_copy=arr[:].copy()
>>> arr_copy
array([-1, -1, -1, -1, -1, -1, -1, -1, -1, -1])
>>> arr_copy[:]=0
>>> arr_copy
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
>>> arr
array([-1, -1, -1, -1, -1, -1, -1, -1, -1, -1])
高阶数组索引
>>> import numpy as np
>>> arr2d=np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> arr2d[2]
array([7, 8, 9])
>>> arr2d[0][2]
3
>>> arr2d[0,2]
3

>>> import numpy as np
>>> arr2d=np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> arr2d[2]
array([7, 8, 9])
>>> arr2d[0][2]
3
>>> arr2d[0,2]
3
>>> arr3d=np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
>>> arr3d
array([[[ 1, 2, 3],
[ 4, 5, 6]],
[[ 7, 8, 9],
[10, 11, 12]]])
>>> arr3d[0]
array([[1, 2, 3],
[4, 5, 6]])
>>> old_values=arr3d[0].copy()
>>> arr3d[0]=42
>>> arr3d
array([[[42, 42, 42],
[42, 42, 42]],
[[ 7, 8, 9],
[10, 11, 12]]])
>>> arr3d[1,0]
array([7, 8, 9])
>>> x=arr3d[1]
>>> x
array([[ 7, 8, 9],
[10, 11, 12]])
>>> x[0]
array([7, 8, 9])
高维数组切片
>>> arr2d[:2]
array([[1, 2, 3],
[4, 5, 6]])
>>> arr2d[:2,1:]
array([[2, 3],
[5, 6]])
>>> arr2d[1,:2]
array([4, 5])
>>> arr2d[:2,2]
array([3, 6])
>>> arr2d[:,:1]
array([[1],
[4],
[7]])

布尔型索引
1.假设我们有一个用于存储数据的数组以及一个存储姓名的数组(含有重复项)。在这里,我将使用numpy.random中的randn函数生成一些正态分布的随机数据:
>>> import numpy as np
>>> names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
>>> data=np.random.randn(7,4)#7行4列正太分布随机数组
>>> names
array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'], dtype='<U4')
>>> data
array([[ 0.24724057, 2.86939948, -0.82061782, -0.65745818],
[-0.98602372, -0.69305692, -1.44431904, -0.85490816],
[-0.73613349, 0.12700976, -1.00588979, 1.10646269],
[ 1.59110894, 1.68597758, 0.39414277, 2.02308399],
[-1.05607115, -0.50354292, -0.65820553, -0.77610316],
[ 1.72237936, -0.07726577, 1.63462647, -0.41943148],
[ 0.66744687, -1.01756773, -0.59254343, 0.19080575]])
2.假设每个名字都对应data数组中的一行,而我们想要选出对应于名字"Bob"的所有行。跟算术运算一样,数组的比较运算(如==)也是矢量化的。因此,对names和字符串"Bob"的比较运算将会产生一个布尔型数组:
>>> names=='Bob'
array([ True, False, False, True, False, False, False])
3.布尔数组可以用于数组的索引
获取等于'Bob'的行
>>> data[names=='Bob']
array([[ 0.24724057, 2.86939948, -0.82061782, -0.65745818],
[ 1.59110894, 1.68597758, 0.39414277, 2.02308399]])
获取不同于'Bob'的行
>>> data[names!='Bob']
array([[-0.98602372, -0.69305692, -1.44431904, -0.85490816],
[-0.73613349, 0.12700976, -1.00588979, 1.10646269],
[-1.05607115, -0.50354292, -0.65820553, -0.77610316],
[ 1.72237936, -0.07726577, 1.63462647, -0.41943148],
[ 0.66744687, -1.01756773, -0.59254343, 0.19080575]])
4.对布尔索引进行列索引
>>> data[names=='Bob',2:]
array([[-0.82061782, -0.65745818],
[ 0.39414277, 2.02308399]])
>>> data[names=='Bob',3]
array([-0.65745818, 2.02308399])
5.反转条件符
>>> cond=names=='Will'
>>> cond
array([False, False, True, False, True, False, False])
>>> data[~cond]
array([[ 0.24724057, 2.86939948, -0.82061782, -0.65745818],
[-0.98602372, -0.69305692, -1.44431904, -0.85490816],
[ 1.59110894, 1.68597758, 0.39414277, 2.02308399],
[ 1.72237936, -0.07726577, 1.63462647, -0.41943148],
[ 0.66744687, -1.01756773, -0.59254343, 0.19080575]])
6.布尔条件的运算
除此之外,连接符还有|、&之类
>>> mask=(names=='Bob')|(names=='Will')
>>> mask
array([ True, False, True, True, True, False, False])
>>> data[mask]
array([[ 0.24724057, 2.86939948, -0.82061782, -0.65745818],
[-0.73613349, 0.12700976, -1.00588979, 1.10646269],
[ 1.59110894, 1.68597758, 0.39414277, 2.02308399],
[-1.05607115, -0.50354292, -0.65820553, -0.77610316]])
7.条件选取
普通条件选取
>>> data[data<0]=0
>>> data
array([[0.24724057, 2.86939948, 0. , 0. ],
[0. , 0. , 0. , 0. ],
[0. , 0.12700976, 0. , 1.10646269],
[1.59110894, 1.68597758, 0.39414277, 2.02308399],
[0. , 0. , 0. , 0. ],
[1.72237936, 0. , 1.63462647, 0. ],
[0.66744687, 0. , 0. , 0.19080575]])
布尔条件选取
>>> import numpy as np
>>> names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
>>> data=np.random.randn(7,4)#7行4列正太分布随机数组
>>> data
array([[-1.24077681, -0.48320904, 1.22145611, 0.00666619],
[-0.65078721, -0.03482355, 1.74232625, 0.2979584 ],
[-1.51669752, 2.04245014, 0.09453898, -0.85531867],
[-1.51334497, 0.36947066, -0.87016919, 1.35107873],
[-1.11285867, -2.20906849, 0.38269412, 1.85375798],
[ 0.95132554, -1.54193589, 1.98741745, -0.60608077],
[ 0.78902133, 1.41593836, 0.09430052, -0.25057659]])
>>> data[names!='Joe']=7
>>> data
array([[ 7. , 7. , 7. , 7. ],
[-0.65078721, -0.03482355, 1.74232625, 0.2979584 ],
[ 7. , 7. , 7. , 7. ],
[ 7. , 7. , 7. , 7. ],
[ 7. , 7. , 7. , 7. ],
[ 0.95132554, -1.54193589, 1.98741745, -0.60608077],
[ 0.78902133, 1.41593836, 0.09430052, -0.25057659]])
>>>
花式索引
1.传入单个索引数组
>>> import numpy as np
>>> arr=np.empty((8,4))#创建8行4列内容为随机值的数组
>>> arr
array([[2.65577744e-260, 7.70858946e+218, 6.01334668e-154,
4.47593816e-091],
[7.01413727e-009, 2.96905203e+222, 2.11672643e+214,
4.56532297e-085],
[4.78409596e+180, 2.44001263e-152, 2.45981714e-154,
6.83528875e+212],
[6.14829725e-071, 1.05161522e-153, 1.05135742e-153,
2.43902457e-154],
[4.83245960e+276, 6.03103052e-154, 7.06652000e-096,
2.65862875e-260],
[1.76380220e+241, 2.30576063e-310, 9.80013217e+040,
1.55850644e-312],
[1.33360318e+241, 4.09842267e-310, 2.48721655e-075,
1.04922745e-312],
[1.91217285e-309, 1.18182126e-125, 6.57144273e-299,
5.54240979e-302]])
>>> for i in range(8):
arr[i]=i
>>> arr
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.]])
>>> arr[[4,3,0,6]]#选特定的索引下标,选取第4,3,0,6行
array([[4., 4., 4., 4.],
[3., 3., 3., 3.],
[0., 0., 0., 0.],
[6., 6., 6., 6.]])
>>> arr[[-3,-5,-7]]#选择特定的索引下标,选取第-3,-5,-7列
array([[5., 5., 5., 5.],
[3., 3., 3., 3.],
[1., 1., 1., 1.]])
2.传入多个索引数组
>>> arr=np.arange(32).reshape((8,4))
>>> arr
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]])
>>> arr[[1,5,7,2],[0,3,1,2]]#选取(1,0),(5,3),(7,1),(2,2)对应元素
array([ 4, 23, 29, 10])
>>> arr[[1,5,7,2]][:,[0,3,1,2]]#先选取第1,5,7,2行,再将每行按照0,3,1,2这个顺序交换
array([[ 4, 7, 5, 6],
[20, 23, 21, 22],
[28, 31, 29, 30],
[ 8, 11, 9, 10]])
numpy数组的索引和切片的更多相关文章
- 3.3Python数据处理篇之Numpy系列(三)---数组的索引与切片
目录 (一)数组的索引与切片 1.说明: 2.实例: (二)多维数组的索引与切片 1.说明: 2.实例: 目录: 1.一维数组的索引与切片 2.多维数组的索引与切片 (一)数组的索引与切片 1.说明: ...
- ndarray数组的索引和切片
索引:获取数组中特定位置元素的过程 切片:获取数组元素子集的过程 import numpy as np 一维数组 一维数组的索引和切片与python中的列表类似 索引:若元素个数为n,则索引下标可表示 ...
- Numpy学习二:数组的索引与切片
1.一维数组索引与切片#创建一维数组arr1d = np.arange(10)print(arr1d) 结果:[0 1 2 3 4 5 6 7 8 9] #数组的索引从0开始,通过索引获取第三个元素a ...
- 利用Python进行数据分析(5) NumPy基础: ndarray索引和切片
概念理解 索引即通过一个无符号整数值获取数组里的值. 切片即对数组里某个片段的描述. 一维数组 一维数组的索引 一维数组的索引和Python列表的功能类似: 一维数组的切片 一维数组的切片语法格式为a ...
- NumPy学习(索引和切片,合并,分割,copy与deep copy)
NumPy学习(索引和切片,合并,分割,copy与deep copy) 目录 索引和切片 合并 分割 copy与deep copy 索引和切片 通过索引和切片可以访问以及修改数组元素的值 一维数组 程 ...
- Numpy:索引与切片
numpy基本的索引和切片 import numpy as np arr = np.array([1,2,3,555,666,888,10]) arr array([ 1, 2, 3, 555, 66 ...
- Numpy 索引及切片
1.一维数组的索引及切片 ar = np.arange(20) print(ar) print(ar[4]) print(ar[3:6]) print(ar[:4:2]) #索引到4 按2的步长 pr ...
- Python数据分析工具库-Numpy 数组支持库(一)
1 Numpy数组 在Python中有类似数组功能的数据结构,比如list,但在数据量大时,list的运行速度便不尽如意,Numpy(Numerical Python)提供了真正的数组功能,以及对数据 ...
- numpy学习笔记 - numpy数组的常见用法
# -*- coding: utf-8 -*- """ 主要记录代码,相关说明采用注释形势,供日常总结.查阅使用,不定时更新. Created on Mon Aug 20 ...
随机推荐
- c语言 - 关键字const的作用
const修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的. 1.const char * p1; //表示p1指向了的字符串不可更改 2.char const ...
- Vue Cli3工具中,配置目录别名,alias
- [BZOJ3611][Heoi2014]大工程(虚树上DP)
3611: [Heoi2014]大工程 Time Limit: 60 Sec Memory Limit: 512 MBSubmit: 2464 Solved: 1104[Submit][Statu ...
- shiro.ini
# # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreeme ...
- 用公共key实现无密码ssh
1.在主服务器master下生成密钥 $ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa 2.将密钥放在 ~/.ssh/authorized_keys $ cat ~ ...
- Java 8:用Stream来循环集合
本文由 ImportNew - 进林 翻译自 deadcoderising.欢迎加入翻译小组.转载请见文末要求. 正如我之前所写的,Java 8中的新功能特性改变了游戏规则.对Java开发者来说这是一 ...
- C++多重继承实践
实践代码如下: #include <iostream> using namespace std; class Animal { private: int hash; public: Ani ...
- Git-Runoob:Git Github
ylbtech-Git-Runoob:Git Github 1.返回顶部 1. Git 远程仓库(Github) Git 并不像 SVN 那样有个中心服务器. 目前我们使用到的 Git 命令都是在本地 ...
- python中unicode utf-8的互换
比较简单明了,直接上例子 # -*- coding: utf-8 -*- t0 = u'测试' #u'\u6d4b\u8bd5' t1 = '测试' #'\xe6\xb5\x8b\xe8\xaf\x9 ...
- Git入门之常用命令(转载阮一峰老师)
流程图 下面是我整理的常用 Git 命令清单.几个专用名词的译名如下. Workspace:工作区 Index / Stage:暂存区 Repository:仓库区(或本地仓库) Remote:远程仓 ...