numpy数组的索引和切片

基本切片操作

  1. >>> import numpy as np
  2. >>> arr=np.arange(10)
  3. >>> arr
  4. array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
  5. >>> arr[5]
  6. 5
  7. >>> arr[5:8]
  8. array([5, 6, 7])

切片赋值操作

1.切片赋一个值对应原来数组中的值也会变

  1. >>> arr[5:8]=12
  2. >>> arr
  3. array([ 0, 1, 2, 3, 4, 12, 12, 12, 8, 9])
  1. >>> import numpy as np
  2. >>> arr=np.arange(10)
  3. >>> arr_slice=arr[5:8]
  4. >>> arr_slice[0]=-1
  5. >>> arr_slice
  6. array([-1, 6, 7])
  7. >>> arr
  8. array([ 0, 1, 2, 3, 4, -1, 6, 7, 8, 9])

2.给数组中所有元素赋值

  1. >>> arr[:]=-1
  2. >>> arr
  3. array([-1, -1, -1, -1, -1, -1, -1, -1, -1, -1])

3.如果想使用复制的方法,使用copy方法

  1. >>> arr_copy=arr[:].copy()
  2. >>> arr_copy
  3. array([-1, -1, -1, -1, -1, -1, -1, -1, -1, -1])
  4. >>> arr_copy[:]=0
  5. >>> arr_copy
  6. array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
  7. >>> arr
  8. array([-1, -1, -1, -1, -1, -1, -1, -1, -1, -1])

高阶数组索引

  1. >>> import numpy as np
  2. >>> arr2d=np.array([[1,2,3],[4,5,6],[7,8,9]])
  3. >>> arr2d[2]
  4. array([7, 8, 9])
  5. >>> arr2d[0][2]
  6. 3
  7. >>> arr2d[0,2]
  8. 3

  1. >>> import numpy as np
  2. >>> arr2d=np.array([[1,2,3],[4,5,6],[7,8,9]])
  3. >>> arr2d[2]
  4. array([7, 8, 9])
  5. >>> arr2d[0][2]
  6. 3
  7. >>> arr2d[0,2]
  8. 3
  9. >>> arr3d=np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
  10. >>> arr3d
  11. array([[[ 1, 2, 3],
  12. [ 4, 5, 6]],
  13. [[ 7, 8, 9],
  14. [10, 11, 12]]])
  15. >>> arr3d[0]
  16. array([[1, 2, 3],
  17. [4, 5, 6]])
  18. >>> old_values=arr3d[0].copy()
  19. >>> arr3d[0]=42
  20. >>> arr3d
  21. array([[[42, 42, 42],
  22. [42, 42, 42]],
  23. [[ 7, 8, 9],
  24. [10, 11, 12]]])
  25. >>> arr3d[1,0]
  26. array([7, 8, 9])
  27. >>> x=arr3d[1]
  28. >>> x
  29. array([[ 7, 8, 9],
  30. [10, 11, 12]])
  31. >>> x[0]
  32. array([7, 8, 9])

高维数组切片

  1. >>> arr2d[:2]
  2. array([[1, 2, 3],
  3. [4, 5, 6]])
  4. >>> arr2d[:2,1:]
  5. array([[2, 3],
  6. [5, 6]])
  7. >>> arr2d[1,:2]
  8. array([4, 5])
  9. >>> arr2d[:2,2]
  10. array([3, 6])
  11. >>> arr2d[:,:1]
  12. array([[1],
  13. [4],
  14. [7]])

布尔型索引

1.假设我们有一个用于存储数据的数组以及一个存储姓名的数组(含有重复项)。在这里,我将使用numpy.random中的randn函数生成一些正态分布的随机数据:

  1. >>> import numpy as np
  2. >>> names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
  3. >>> data=np.random.randn(7,4)#74列正太分布随机数组
  4. >>> names
  5. array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'], dtype='<U4')
  6. >>> data
  7. array([[ 0.24724057, 2.86939948, -0.82061782, -0.65745818],
  8. [-0.98602372, -0.69305692, -1.44431904, -0.85490816],
  9. [-0.73613349, 0.12700976, -1.00588979, 1.10646269],
  10. [ 1.59110894, 1.68597758, 0.39414277, 2.02308399],
  11. [-1.05607115, -0.50354292, -0.65820553, -0.77610316],
  12. [ 1.72237936, -0.07726577, 1.63462647, -0.41943148],
  13. [ 0.66744687, -1.01756773, -0.59254343, 0.19080575]])

2.假设每个名字都对应data数组中的一行,而我们想要选出对应于名字"Bob"的所有行。跟算术运算一样,数组的比较运算(如==)也是矢量化的。因此,对names和字符串"Bob"的比较运算将会产生一个布尔型数组:

  1. >>> names=='Bob'
  2. array([ True, False, False, True, False, False, False])

3.布尔数组可以用于数组的索引

获取等于'Bob'的行

  1. >>> data[names=='Bob']
  2. array([[ 0.24724057, 2.86939948, -0.82061782, -0.65745818],
  3. [ 1.59110894, 1.68597758, 0.39414277, 2.02308399]])

获取不同于'Bob'的行

  1. >>> data[names!='Bob']
  2. array([[-0.98602372, -0.69305692, -1.44431904, -0.85490816],
  3. [-0.73613349, 0.12700976, -1.00588979, 1.10646269],
  4. [-1.05607115, -0.50354292, -0.65820553, -0.77610316],
  5. [ 1.72237936, -0.07726577, 1.63462647, -0.41943148],
  6. [ 0.66744687, -1.01756773, -0.59254343, 0.19080575]])

4.对布尔索引进行列索引

  1. >>> data[names=='Bob',2:]
  2. array([[-0.82061782, -0.65745818],
  3. [ 0.39414277, 2.02308399]])
  4. >>> data[names=='Bob',3]
  5. array([-0.65745818, 2.02308399])

5.反转条件符

  1. >>> cond=names=='Will'
  2. >>> cond
  3. array([False, False, True, False, True, False, False])
  4. >>> data[~cond]
  5. array([[ 0.24724057, 2.86939948, -0.82061782, -0.65745818],
  6. [-0.98602372, -0.69305692, -1.44431904, -0.85490816],
  7. [ 1.59110894, 1.68597758, 0.39414277, 2.02308399],
  8. [ 1.72237936, -0.07726577, 1.63462647, -0.41943148],
  9. [ 0.66744687, -1.01756773, -0.59254343, 0.19080575]])

6.布尔条件的运算

除此之外,连接符还有|、&之类

  1. >>> mask=(names=='Bob')|(names=='Will')
  2. >>> mask
  3. array([ True, False, True, True, True, False, False])
  4. >>> data[mask]
  5. array([[ 0.24724057, 2.86939948, -0.82061782, -0.65745818],
  6. [-0.73613349, 0.12700976, -1.00588979, 1.10646269],
  7. [ 1.59110894, 1.68597758, 0.39414277, 2.02308399],
  8. [-1.05607115, -0.50354292, -0.65820553, -0.77610316]])

7.条件选取

普通条件选取

  1. >>> data[data<0]=0
  2. >>> data
  3. array([[0.24724057, 2.86939948, 0. , 0. ],
  4. [0. , 0. , 0. , 0. ],
  5. [0. , 0.12700976, 0. , 1.10646269],
  6. [1.59110894, 1.68597758, 0.39414277, 2.02308399],
  7. [0. , 0. , 0. , 0. ],
  8. [1.72237936, 0. , 1.63462647, 0. ],
  9. [0.66744687, 0. , 0. , 0.19080575]])

布尔条件选取

  1. >>> import numpy as np
  2. >>> names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
  3. >>> data=np.random.randn(7,4)#74列正太分布随机数组
  4. >>> data
  5. array([[-1.24077681, -0.48320904, 1.22145611, 0.00666619],
  6. [-0.65078721, -0.03482355, 1.74232625, 0.2979584 ],
  7. [-1.51669752, 2.04245014, 0.09453898, -0.85531867],
  8. [-1.51334497, 0.36947066, -0.87016919, 1.35107873],
  9. [-1.11285867, -2.20906849, 0.38269412, 1.85375798],
  10. [ 0.95132554, -1.54193589, 1.98741745, -0.60608077],
  11. [ 0.78902133, 1.41593836, 0.09430052, -0.25057659]])
  12. >>> data[names!='Joe']=7
  13. >>> data
  14. array([[ 7. , 7. , 7. , 7. ],
  15. [-0.65078721, -0.03482355, 1.74232625, 0.2979584 ],
  16. [ 7. , 7. , 7. , 7. ],
  17. [ 7. , 7. , 7. , 7. ],
  18. [ 7. , 7. , 7. , 7. ],
  19. [ 0.95132554, -1.54193589, 1.98741745, -0.60608077],
  20. [ 0.78902133, 1.41593836, 0.09430052, -0.25057659]])
  21. >>>

花式索引

1.传入单个索引数组

  1. >>> import numpy as np
  2. >>> arr=np.empty((8,4))#创建84列内容为随机值的数组
  3. >>> arr
  4. array([[2.65577744e-260, 7.70858946e+218, 6.01334668e-154,
  5. 4.47593816e-091],
  6. [7.01413727e-009, 2.96905203e+222, 2.11672643e+214,
  7. 4.56532297e-085],
  8. [4.78409596e+180, 2.44001263e-152, 2.45981714e-154,
  9. 6.83528875e+212],
  10. [6.14829725e-071, 1.05161522e-153, 1.05135742e-153,
  11. 2.43902457e-154],
  12. [4.83245960e+276, 6.03103052e-154, 7.06652000e-096,
  13. 2.65862875e-260],
  14. [1.76380220e+241, 2.30576063e-310, 9.80013217e+040,
  15. 1.55850644e-312],
  16. [1.33360318e+241, 4.09842267e-310, 2.48721655e-075,
  17. 1.04922745e-312],
  18. [1.91217285e-309, 1.18182126e-125, 6.57144273e-299,
  19. 5.54240979e-302]])
  20. >>> for i in range(8):
  21. arr[i]=i
  22. >>> arr
  23. array([[0., 0., 0., 0.],
  24. [1., 1., 1., 1.],
  25. [2., 2., 2., 2.],
  26. [3., 3., 3., 3.],
  27. [4., 4., 4., 4.],
  28. [5., 5., 5., 5.],
  29. [6., 6., 6., 6.],
  30. [7., 7., 7., 7.]])
  31. >>> arr[[4,3,0,6]]#选特定的索引下标,选取第4306
  32. array([[4., 4., 4., 4.],
  33. [3., 3., 3., 3.],
  34. [0., 0., 0., 0.],
  35. [6., 6., 6., 6.]])
  36. >>> arr[[-3,-5,-7]]#选择特定的索引下标,选取第-3,-5,-7
  37. array([[5., 5., 5., 5.],
  38. [3., 3., 3., 3.],
  39. [1., 1., 1., 1.]])

2.传入多个索引数组

  1. >>> arr=np.arange(32).reshape((8,4))
  2. >>> arr
  3. array([[ 0, 1, 2, 3],
  4. [ 4, 5, 6, 7],
  5. [ 8, 9, 10, 11],
  6. [12, 13, 14, 15],
  7. [16, 17, 18, 19],
  8. [20, 21, 22, 23],
  9. [24, 25, 26, 27],
  10. [28, 29, 30, 31]])
  11. >>> arr[[1,5,7,2],[0,3,1,2]]#选取(1,0),(5,3),(7,1),(2,2)对应元素
  12. array([ 4, 23, 29, 10])
  1. >>> arr[[1,5,7,2]][:,[0,3,1,2]]#先选取第1,5,7,2行,再将每行按照0,3,1,2这个顺序交换
  2. array([[ 4, 7, 5, 6],
  3. [20, 23, 21, 22],
  4. [28, 31, 29, 30],
  5. [ 8, 11, 9, 10]])

numpy数组的索引和切片的更多相关文章

  1. 3.3Python数据处理篇之Numpy系列(三)---数组的索引与切片

    目录 (一)数组的索引与切片 1.说明: 2.实例: (二)多维数组的索引与切片 1.说明: 2.实例: 目录: 1.一维数组的索引与切片 2.多维数组的索引与切片 (一)数组的索引与切片 1.说明: ...

  2. ndarray数组的索引和切片

    索引:获取数组中特定位置元素的过程 切片:获取数组元素子集的过程 import numpy as np 一维数组 一维数组的索引和切片与python中的列表类似 索引:若元素个数为n,则索引下标可表示 ...

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

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

  4. 利用Python进行数据分析(5) NumPy基础: ndarray索引和切片

    概念理解 索引即通过一个无符号整数值获取数组里的值. 切片即对数组里某个片段的描述. 一维数组 一维数组的索引 一维数组的索引和Python列表的功能类似: 一维数组的切片 一维数组的切片语法格式为a ...

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

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

  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 索引及切片

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

  8. Python数据分析工具库-Numpy 数组支持库(一)

    1 Numpy数组 在Python中有类似数组功能的数据结构,比如list,但在数据量大时,list的运行速度便不尽如意,Numpy(Numerical Python)提供了真正的数组功能,以及对数据 ...

  9. numpy学习笔记 - numpy数组的常见用法

    # -*- coding: utf-8 -*- """ 主要记录代码,相关说明采用注释形势,供日常总结.查阅使用,不定时更新. Created on Mon Aug 20 ...

随机推荐

  1. poj 3685 Matrix 二分套二分 经典题型

    Matrix Time Limit: 6000MS   Memory Limit: 65536K Total Submissions: 5724   Accepted: 1606 Descriptio ...

  2. 分享几个免费IP地址查询接口(API)

    淘宝IP地址库 提供的服务包括:1. 根据用户提供的IP地址,快速查询出该IP地址所在的地理信息和地理相关的信息,包括国家.省.市和运营商.2. 用户可以根据自己所在的位置和使用的IP地址更新我们的服 ...

  3. LeetCode 46. 全排列(Permutations)

    题目描述 给定一个没有重复数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [ ...

  4. C++11获取当前毫秒数

    获取当前毫秒数 主要是打印日志的时候用到 / CLOCKS_PER_SEC); 头文件为ctime

  5. webDriver各版本对应

    chromeDriver http://npm.taobao.org/mirrors/chromedriver/ http://chromedriver.storage.googleapis.com/ ...

  6. DP练习题——洛谷P1970花匠

    目录 题目描述: 输入输出格式: 输入格式: 输出格式: 输入输出样例: 输入样例: 输出样例: 题目分析: 解法一: 解法二: 结语: 题目描述: 洛谷\(P1970\) 花匠栋栋种了一排花,每株花 ...

  7. C# NAudio 变声

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  8. Firefox63以后 禁止自动更新方式

    参考:https://bbs.kafan.cn/thread-2135160-1-1.html 63版以后在prefs.js文件末尾加代码来禁止自动更新的方式失效 新方式: 使用DisableAppU ...

  9. Raspbian 编译安装 PHP 7.2

    原文地址:Raspbian 编译安装 PHP 7.2 0x00 配置 开发板: Raspberry Pi 3B 系统: Raspbian 2019-04-08 stretch 0x01 下载源码 20 ...

  10. 代码实现:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字

    import java.util.Scanner; /*题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字. 例如2+22+222+2222+22222(此时共有5个数相加), ...