NumPy 教程目录

NumPy 迭代数组

  NumPy 迭代器对象  numpy.nditer  提供了一种灵活访问一个或者多个数组元素的方式。

  迭代器最基本的任务的可以完成对数组元素的访问。

Example:使用 arange() 函数创建一个 2X3 数组,并使用 nditer 对它进行迭代。

  1. a = np.arange(6).reshape(2,3)
  2. print('原始数组是')
  3. print(a)
  4. print('迭代输出元素')
  5. for x in np.nditer(a):
  6. print(x,end=' ')
  7. #输出结果
  8. 原始数组是
  9. [[0 1 2]
  10. [3 4 5]]
  11. 迭代输出元素
  12. 0 1 2 3 4 5

Example:

  1. a = np.arange(8).reshape(2,2,2)
  2. print('原始数组是')
  3. print(a)
  4. print('迭代输出元素')
  5. for x in np.nditer(a):
  6. print(x,end=' ')
  7.  
  8. #输出结果
  9. 原始数组是
  10. [[[0 1]
  11. [2 3]]
  12.  
  13. [[4 5]
  14. [6 7]]]
  15. 迭代输出元素
  16. 0 1 2 3 4 5 6 7

  以上实例不是使用标准 C 或者 Fortran 顺序,选择的顺序是和数组内存布局一致的,这样做是为了提升访问的效率,默认是行序优先(row-major order,或者说是 C-order)。

  这反映了默认情况下只需访问每个元素,而无需考虑其特定顺序。我们可以通过迭代上述数组的转置来看到这一点,并与以 C 顺序访问数组转置的 copy 方式做对比,如下实例:

Example:

  1. a = np.arange(6).reshape(2,3)
  2. for x in np.nditer(a.T):
  3. print(x,end=' ')
  4. print()
  5. print(a.T.copy(order ='C'))
  6. for x in np.nditer(a.T.copy(order ='C')):
  7. print(x,end=' ')
  8. #输出结果
  9. 0 1 2 3 4 5
  10. [[0 3]
  11. [1 4]
  12. [2 5]]
  13. 0 3 1 4 2 5

  从上述例子可以看出,aa.T 的遍历顺序是一样的,也就是他们在内存中的存储顺序也是一样的,但是  a.T.copy(order = 'C')  的遍历结果是不同的,那是因为它和前两种的存储方式是不一样的,默认是按行访问。

控制遍历顺序

  • for x in np.nditer(a, order='F'):Fortran order,即是列序优先;
  • for x in np.nditer(a.T, order='C'):C order,即是行序优先;

Example:

  1. a = np.arange(0,60,5)
  2. a = a.reshape(3,4)
  3. print ('原始数组是:')
  4. print (a)
  5. print ('\n')
  6. print ('原始数组的转置是:')
  7. b = a.T
  8. print (b)
  9. print ('\n')
  10. print ('以 C 风格顺序排序:')
  11. c = b.copy(order='C')
  12. print (c)
  13. for x in np.nditer(c):
  14. print (x, end=", " )
  15. print ('\n')
  16. print ('以 F 风格顺序排序:')
  17. c = b.copy(order='F')
  18. print (c)
  19. for x in np.nditer(c):
  20. print (x, end=", " )
  21. #输出结果
  22. 原始数组是:
  23. [[ 0 5 10 15]
  24. [20 25 30 35]
  25. [40 45 50 55]]
  26.  
  27. 原始数组的转置是:
  28. [[ 0 20 40]
  29. [ 5 25 45]
  30. [10 30 50]
  31. [15 35 55]]
  32.  
  33. C 风格顺序排序:
  34. [[ 0 20 40]
  35. [ 5 25 45]
  36. [10 30 50]
  37. [15 35 55]]
  38. 0, 20, 40, 5, 25, 45, 10, 30, 50, 15, 35, 55,
  39.  
  40. F 风格顺序排序:
  41. [[ 0 20 40]
  42. [ 5 25 45]
  43. [10 30 50]
  44. [15 35 55]]
  45. 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55,

  可以通过显式设置,来强制 nditer 对象使用某种顺序:

Example:

  1. a = np.arange(0,60,5)
  2. a = a.reshape(3,4)
  3. print ('原始数组是:')
  4. print (a)
  5. print ('\n')
  6. print ('以 C 风格顺序排序:')
  7. for x in np.nditer(a, order = 'C'):
  8. print (x, end=" " )
  9. print ('\n')
  10. print ('以 F 风格顺序排序:')
  11. for x in np.nditer(a, order = 'F'):
  12. print (x, end=" " )
  13. #输出结果
  14. 原始数组是:
  15. [[ 0 5 10 15]
  16. [20 25 30 35]
  17. [40 45 50 55]]
  18.  
  19. C 风格顺序排序:
  20. 0 5 10 15 20 25 30 35 40 45 50 55
  21.  
  22. F 风格顺序排序:
  23. 0 20 40 5 25 45 10 30 50 15 35 55

修改数组中元素的值

  nditer 对象有另一个可选参数 op_flags。 默认情况下,nditer 将视待迭代遍历的数组为只读对象(read-only),为了在遍历数组的同时,实现对数组元素值得修改,必须指定 read-write 或者 write-only 的模式。

Example:

  1. x = np.arange(6).reshape((2,3))
  2. print('The original array is')
  3. print(x)
  4. for tmp in np.nditer(x,op_flags =['readwrite']):
  5. tmp[...] = 1
  6. print("The modified array is")
  7. print(x)
  8. #output result
  9. """
  10. The original array is
  11. [[0 1 2]
  12. [3 4 5]]
  13. The modified array is
  14. [[1 1 1]
  15. [1 1 1]]
  16. """

使用外部循环

  nditer 类的构造器拥有 flags 参数,它可以接受下列值:

参数 描述
c_index 可以跟踪 C 顺序的索引
f_index 可以跟踪 Fortran 顺序的索引
multi_index 每次迭代可以跟踪一种索引类型
external_loop 给出的值是具有多个值的一维数组,而不是零维数组

  在下面的实例中,迭代器遍历对应于每列,并组合为一维数组。

Example:

  1. x = np.arange(9).reshape((3,3))
  2. print("The original array is ")
  3. print(x)
  4. print('The modified array is ')
  5. for x in np.nditer(x,flags=['external_loop'],order='F'):
  6. print(x)
  7. #output result
  8. """
  9. The original array is
  10. [[0 1 2]
  11. [3 4 5]
  12. [6 7 8]]
  13. The modified array is
  14. [0 3 6]
  15. [1 4 7]
  16. [2 5 8]
  17. """

广播迭代

  如果两个数组是可广播的,nditer 组合对象能够同时迭代它们。 假设数组 $ a $ 的维度为 $3X4$,数组 $b$ 的维度为 $1X4$ ,则使用以下迭代器(数组  $b$  被广播到  $a$  的大小)。

Example:

  1. a = np.arange(0,60,5)
  2. a = a.reshape(3,4)
  3. print ('First array:')
  4. print (a)
  5. print ('\n')
  6. print ('Second array:')
  7. b = np.array([1, 2, 3, 4], dtype = int)
  8. print (b)
  9. print ('\n')
  10. print ('The modified array :')
  11. for x,y in np.nditer([a,b]):
  12. print ("%d:%d" % (x,y), end=", " )
  13. #output result
  14. """
  15. First array:
  16. [[ 0 5 10 15]
  17. [20 25 30 35]
  18. [40 45 50 55]]
  19.  
  20. Second array:
  21. [1 2 3 4]
  22.  
  23. The modified array :
  24. 0:1, 5:2, 10:3, 15:4, 20:1, 25:2, 30:3, 35:4, 40:1, 45:2, 50:3, 55:4,
  25. """

Lesson10——NumPy 迭代数组的更多相关文章

  1. NumPy 迭代数组

    NumPy 迭代数组 NumPy 迭代器对象 numpy.nditer 提供了一种灵活访问一个或者多个数组元素的方式. 迭代器最基本的任务的可以完成对数组元素的访问. 接下来我们使用 arange() ...

  2. NumPy迭代数组

    numpy.nditer是NumPy的一个迭代器对象,提供能够灵活的访问一个或者多个属猪元素的方式. # 迭代 z=np.arange(6).reshape(3,2) for x in np.ndit ...

  3. 吴裕雄--天生自然Numpy库学习笔记:NumPy 迭代数组

    import numpy as np a = np.arange(6).reshape(2,3) print ('原始数组是:') print (a) print ('\n') print ('迭代输 ...

  4. 找出numpy array数组的最值及其索引

    在list列表中,max(list)可以得到list的最大值,list.index(max(list))可以得到最大值对应的索引 但在numpy中的array没有index方法,取而代之的是where ...

  5. python 工具 字符串转numpy浮点数组

    不同的数字之间使用 空格“ ”,“$”,"*"等隔开,支持带小数点的字符串NumArray=str2num(LineString,comment='#')将字符串中的所有非Doub ...

  6. Numpy | 04 数组属性

    NumPy 数组的维数称为秩(rank),一维数组的秩为 1,二维数组的秩为 2,以此类推. 在 NumPy中,每一个线性的数组称为是一个轴(axis),也就是维度(dimensions).比如说,二 ...

  7. numpy使用数组进行数据处理

    numpy使用数组进行数据处理 meshgrid函数 理解: 二维坐标系中,X轴可以取三个值1,2,3, Y轴可以取三个值7,8, 请问可以获得多少个点的坐标? 显而易见是6个: (1,7)(2,7) ...

  8. python数据分析 Numpy基础 数组和矢量计算

    NumPy(Numerical Python的简称)是Python数值计算最重要的基础包.大多数提供科学计算的包都是用NumPy的数组作为构建基础. NumPy的部分功能如下: ndarray,一个具 ...

  9. Numpy中数组的乘法

    Numpy中数组的乘法 按照两个相乘数组A和B的维度不同,分为以下乘法: 数字与一维/二维数组相乘: 一维数组与一维数组相乘: 二维数组与一维数组相乘: 二维数组与二维数组相乘: numpy有以下乘法 ...

随机推荐

  1. html 基础 vscode的常用快捷键

    1.ctrl+/ //注释代码 2.文件内容查找替换:ctrl+f ctrl+h ,替换一个ctrl+shift+1,替换所有ctrl+alt+enter 3.移动当前行,向上alt+up(方向键↑) ...

  2. CentOS8.2安装docker

    1:安装docker前准备docker配置仓库(安装yum-utils是提供一个yum-config-manager单元,同时安装的device-mapper-persistent-data和lvm2 ...

  3. Pytest_在jenkins中使用allure报告(13)

    一.安装allure插件 点击jenkins管理-->插件管理 点击Available,在搜索框中输入allure并安装 二.配置构建命令 三.构建配置allure插件 点击构建后置操作 pat ...

  4. Pytest_参数化(10)

    pytest参数化有两种方式: mark的parametrize标记:@pytest.mark.parametrize(变量名,变量值),其中变量值类型为列表.元组或其它可迭代对象. fixture的 ...

  5. Selenium_获取界面handle、title和url(7)

    from selenium import webdriver driver = webdriver.Chrome() driver.maximize_window() driver.get(" ...

  6. spring boot 热部署 实现 前端部分热更新 详细操作

    1.前言 在以前的随笔[https://www.cnblogs.com/c2g5201314/p/12275243.html] 里面已经讲解过了 idea 如何在 springMVC 项目 实现 前端 ...

  7. Go语言系列之标准库ioutil

    ioutil标准库中提供了一些常用.方便的IO操作函数 一.相关方法 func ReadAll(r io.Reader) ([]byte, error) func ReadDir(dirname st ...

  8. Sentry 开发者贡献指南 - Django Rest Framework(Serializers)

    Serializer 用于获取复杂的 python 模型并将它们转换为 json.序列化程序还可用于在验证传入数据后将 json 反序列化回 Python 模型. 在 Sentry,我们有两种不同类型 ...

  9. Linux下Redis 6.2.6安装和部署详细图文步骤

    Redis(Remote Dictionary Server),即远程字典服务,是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的 ...

  10. ClassCastException: java.util.Date cannot be cast to java.sql.Date

    解决办法 /** * 单个方法,作用,根据输入的day:yyyy-mm-dd格式的字符日期,将数据库中的该天所有数据更新为0 * 0表示假期 * @param day * @throws SQLExc ...