numpy中数组的遍历技巧 您所在的位置:网站首页 python遍历二维列表所有元素的数据 numpy中数组的遍历技巧

numpy中数组的遍历技巧

2023-10-18 08:45| 来源: 网络整理| 查看: 265

在numpy中,当需要循环处理数组中的元素时,能用内置通函数实现的肯定首选通函数,只有当没有可用的通函数的情况下,再来手动进行遍历,遍历的方法有以下几种

1. 内置for循环

最基础的遍历方法还是for循环,用法如下

# 一维数组,和普通的python序列对象一致 >>> a array([0, 1, 2, 3, 4]) >>> for i in a: ... print(i) ... 0 1 2 3 4 # 二维数组,每次遍历一行,以列表的形式返回一行的元素 >>> a = np.arange(12).reshape(3, 4) >>> a array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) >>> for i in a: ... print(i) ... [0 1 2 3] [4 5 6 7] [ 8 9 10 11]

for循环中得到的是对应元素的副本,所以通过上述方式只能访问,不能修改原始数组中的值。

2. flat迭代器

数组的flat属性返回的是数组的迭代器,通过这个迭代器,可以一层for循环就搞定多维数组的访问,用法如下

>>> a array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) >>> for i in a.flat: ... print(i) ... 0 1 2 3 4 5 6 7 8 9 10 11

3. nditer迭代器

numpy中的nditer函数可以返回数组的迭代器,该迭代器的功能比flat更加强大和灵活,在遍历多维数组时,通过order参数可以指定遍历的顺序,C表示C语言的风格,优先处理行,F表示Fortran语言的风格,优先处理列,用法如下

>>> a array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) # 默认按行处理 >>> for i in np.nditer(a, order='C'): ... print(i) ... 0 1 2 3 4 5 6 7 8 9 10 11 # 按列处理 >>> for i in np.nditer(a, order='F'): ... print(i) ... 0 4 8 1 5 9 2 6 10 3 7 11

普通的遍历只能访问元素,而nditer可以允许我们在遍历的同时修改原始数组中的元素,只需要op_flags参数即可,用法如下

>>> a array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) >>> for i in np.nditer(a, op_flags = ['readwrite']): ... i *= 2 ... >>> a array([[ 0, 2, 4, 6], [ 8, 10, 12, 14], [16, 18, 20, 22]]) >>> for i in np.nditer(a, op_flags = ['writeonly']): ... i += 2 ... >>> a array([[ 2, 4, 6, 8], [10, 12, 14, 16], [18, 20, 22, 24]])

nditer更强大的功能在于广播遍历,通过内置的广播机制,可以实现两个数组的组合,用法如下

>>> a = np.arange(12).reshape(3, 4) >>> a array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) >>> b = np.arange(4) >>> b array([0, 1, 2, 3]) >>> np.nditer([a, b]) >>> for x,y in np.nditer([a,b]): ... print(x,y) ... 0 0 1 1 2 2 3 3 4 0 5 1 6 2 7 3 8 0 9 1 10 2 11 3 ``` ``` >>> b = np.arange(3).reshape(-1, 1) >>> b array([[0], [1], [2]]) >>> a array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) >>> for x,y in np.nditer([a,b]): ... print(x,y) ... 0 0 1 0 2 0 3 0 4 1 5 1 6 1 7 1 8 2 9 2 10 2 11 2

简单的元素访问直接使用for循环迭代数组即可,注意二维数组和一维数组的区别,nditer的3个特点对应不同的使用场景,当遇到对应的情况时,可以选择nditer来进行遍历。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有