iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >nditer—numpy.ndarray 多维数组的迭代操作
  • 936
分享到

nditer—numpy.ndarray 多维数组的迭代操作

2024-04-02 19:04:59 936人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

1. Single array iteration >>> a = np.arange(6).reshape(2,3) >>> for x i

1. Single array iteration


>>> a = np.arange(6).reshape(2,3)
>>> for x in np.nditer(a):
...     print x,
...
0 1 2 3 4 5

也即默认是行序优先(row-major order,或者说是 C-order),这样迭代遍历的目的在于,实现和内存分布格局的一致性,以提升访问的便捷性;


>>> for x in np.nditer(a.T):
...     print x,
...
0 1 2 3 4 5
>>> for x in np.nditer(a.T.copy(order='C')):
...     print x,
...
0 3 1 4 2 5

也即对 a 和 a.T 的遍历执行的是同意顺序,也即是它们在内存中的实际存储顺序。

2. 控制遍历顺序


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

3. 修改数组中元素的值

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


>>> a
array([[0, 1, 2],
       [3, 4, 5]])
>>> for x in np.nditer(a, op_flags=['readwrite']):
...     x[...] = 2 * x
...
>>> a
array([[ 0,  2,  4],
       [ 6,  8, 10]])

4. 使用外部循环

将一维的最内层的循环转移到外部循环迭代器,使得 numpy 的矢量化操作在处理更大规模数据时变得更有效率。


>>> a = np.arange(6).reshape(2,3)
>>> for x in np.nditer(a, flags=['external_loop']):
...     print x,
...
[0 1 2 3 4 5]
>>>
>>> for x in np.nditer(a, flags=['external_loop'], order='F'):
...     print x,
...
[0 3] [1 4] [2 5]

5. 追踪单个索引或多重索引(multi-index)


>>> a = np.arange(6).reshape(2,3)
>>> a
array([[0, 1, 2],
       [3, 4, 5]])
>>> it = np.nditer(a, flags=['f_index'])
>>> while not it.finished:
...     print "%d <%d>" % (it[0], it.index),
...     it.iternext()
...
0 <0> 1 <2> 2 <4> 3 <1> 4 <3> 5 <5>
            # 索引的编号,以列序优先

>>> it = np.nditer(a, flags=['multi_index'])
>>> while not it.finished:
...     print "%d <%s>" % (it[0], it.multi_index),
...     it.iternext()
...
0 <(0, 0)> 1 <(0, 1)> 2 <(0, 2)> 3 <(1, 0)> 4 <(1, 1)> 5 <(1, 2)>

补充:详解 Numpy.ndarray

向量、矩阵 & 多维数组是数值计算中必不可少的工具;通过对数组数据进行批量处理,避免了对数组元素显式地进行循环操作,这样做的结果是可以得到简洁、更易维护的代码,并且可以使用更底层的库来实现数组操作。因此,向量化计算相比按顺序逐元素进行计算要快得多。

python科学计算环境中,Numpy 库提供了用于处理数组的高效数据结构,且Numpy的核心是使用C语言实现的,提供了很多处理和处理数组的函数。

NumPy支持比Python更多种类的数字类型,有5种基本数字类型:

布尔值(bool)

整数(int)

无符号整数(uint)

浮点(float)

复数(complex)

Numpy库的核心是表示 同质的多维数据 —— 每个元素占用相同大小的内存块, 并且所有块都以完全相同的方式解释。 如何解释数组中的每个元素由单独的数据类型对象指定, 其中一个对象与每个数组相关联。除了基本类型(整数,浮点数 等 )之外, 数据类型对象还可以表示数据结构。

1、创建 Numpy 数组

NumPy提供了一个N维数组类型,即ndarray, 它描述了相同类型的“项目集合。可以使用例如N个整数来索引项目。从数组中提取的项( 例如 ,通过索引)由Python对象表示, 其类型是在NumPy中构建的数组标量类型之一。 数组标量允许容易地操纵更复杂的数据排列。

ndarray 与 array 的区别

np.array 只是一个便捷的函数,用来创建一个ndarray,它本身不是一个类。

ndarray 数组,是用 np.ndarray类的对象 表示n维数组对象

所以ndarray是一个类对象,而array是一个方法。

创建数组有5种常规机制:

从其他Python结构(例如,列表,元组)转换

numpy原生数组的创建(例如,arange、ones、zeros等)

从磁盘读取数组,无论是标准格式还是自定义格式

通过使用字符串或缓冲区从原始字节创建数组

使用特殊库函数(例如,random)

1、np.array

一个 ndarray是具有相同类型和大小的项目的(通常是固定大小的)多维容器。 尺寸和数组中的项目的数量是由它的shape定义, 它是由N个非负整数组成的tuple(元组),用于指定每个维度的大小。 数组中项目的类型由单独的data-type object (dtype)指定, 其中一个与每个ndarray相关联。

与Python中的其他容器对象一样,可以通过对数组进行索引或切片(例如,使用N个整数)以及通过ndarray的方法和属性来访问和修改ndarray的内容。

不同的是,ndarrays可以共享相同的数据, 因此在一个ndarray中进行的更改可能在另一个中可见。 也就是说,ndarray可以是另一个ndarray 的 “view” ,它所指的数据由 “base” ndarray处理。 ndarrays也可以是Python拥有的内存strings或实现 buffer 或数组接口的对象的视图。

通过 np.array() & np.ndarray() 创建


# Create an array.
np.array(object, dtype=None, copy=True, order='K', subok=False, ndmin=0)
np.ndarray(shape, dtype=float, buffer=None, offset=0, strides=None, order=None)

一个 ndarray是具有相同类型和大小的项目的多维容器。

尺寸和数组中的项目的数量是由它的shape定义, 它是由N个非负整数组成的tuple(元组),用于指定每个维度的大小。

不同的是,ndarrays可以共享相同的数据, 因此在一个ndarray中进行的更改可能在另一个中可见。 也就是说,ndarray可以是另一个ndarray 的 “view” ,它所指的数据由 “base” ndarray处理。 ndarrays也可以是Python拥有的内存strings或实现 buffer 或数组接口的对象的视图。

Examples:


>>> np.array([1, 2, 3])
array([1, 2, 3])
>>> np.array([1, 2, 3.0])
array([ 1., 2., 3.])
>>> np.array([[1, 2], [3, 4]])
array([[1, 2],
[3, 4]])
>>> np.array([1, 2, 3], ndmin=2)
array([[1, 2, 3]])
>>> np.array([1, 2, 3], dtype=complex)
array([ 1.+0.j, 2.+0.j, 3.+0.j])
>>> x = np.array([(1,2),(3,4)],dtype=[('a','<i4'),('b','<i4')])
>>> x['a']
array([1, 3])
>>> np.array(np.mat('1 2; 3 4'))
array([[1, 2],
[3, 4]])
>>> np.array(np.mat('1 2; 3 4'), subok=True)
matrix([[1, 2],
[3, 4]])
>>> np.ndarray(shape=(2,2), dtype=float, order='F')
array([[ -1.13698227e+002, 4.25087011e-303],
[ 2.88528414e-306, 3.27025015e-309]])  #random
>>> np.ndarray((2,), buffer=np.array([1,2,3]),
offset=np.int_().itemsize,
dtype=int)         # offset = 1 * itemsize, i.e. skip first element
array([2, 3])

2、基本属性

数组属性反映了数组本身固有的信息。通常,通过其属性访问数组允许您获取并有时设置数组的内部属性,而无需创建新数组。公开的属性是数组的核心部分,只有一些属性可以有意义地重置而无需创建新数组。有关每个属性的信息如下。

内存布局

以下属性包含有关数组内存布局的信息:


   方法        描   述
| ndarray.flags  | 有关数组内存布局的信息。     
| ndarray.shape  | 数组维度的元组。       
| ndarray.strides  | 遍历数组时每个维度中的字节元组。   
| ndarray.ndim  | 数组维数。        
| ndarray.data  | Python缓冲区对象指向数组的数据的开头。  
| ndarray.size  | 数组中的元素数。       
| ndarray.itemsize | 一个数组元素的长度,以字节为单位。   
| ndarray.nbytes  | 数组元素消耗的总字节数。     
| ndarray.base  | 如果内存来自其他对象,则为基础对象。

数据类型

可以在dtype属性中找到与该数组关联的数据类型对象 :


   方法   |  描   述
| ndarray.dtype  | 数组元素的数据类型。     

其他属性


   方法   |  描   述
| ndarray.T   | 转置数组。        
| ndarray.real  | 数组的真实部分。       
| ndarray.imag  | 数组的虚部。        
| ndarray.flat  | 数组上的一维迭代器。      
| ndarray.ctypes  | 一个简化数组与ctypes模块交互的对象。  

3、Numpy 原生数组 创建 ndarray


       方法            |          描   述 
| eye(N[, M, k, dtype, order])       | 返回一个二维数组,对角线上有一个,其他地方为零
| identity(n[, dtype])         | 返回标识数组。 
| ones(shape[, dtype, order])       | 返回给定形状和类型的新数组,并填充为1
| ones_like(a[, dtype, order, subok, shape])    | 返回形状与类型与给定数组相同的数组。
| zeros(shape[, dtype, order])       | 返回给定形状和类型的新数组,并用零填充。
| zeros_like(a[, dtype, order, subok, shape])   | 返回形状与类型与给定数组相同的零数组。 
| full(shape, fill_value[, dtype, order])    | 返回给定形状和类型的新数组,并用fill_value填充
| full_like(a, fill_value[, dtype, order, …])   | 返回形状和类型与给定数组相同的完整数组
| empty(shape[, dtype, order])       | 返回给定形状和类型的新数组,而无需初始化条目
| empty_like(prototype[, dtype, order, subok, …])  | 返回形状和类型与给定数组相同的新数组

zeros_like()、ones_like()、empty_like() 等带 _like() 的函数创建与参数数组的形状及类型相同的数组。

frombuffer()、fromstring()、fromfile() 等函数可以从字节序列或文件创建数组

4、np.arange


|      方法                       |   描   述 
|  arange([start,] stop[, step,][, dtype])     | 返回给定间隔内的均匀间隔的值。
|  linspace(start, stop[, num, endpoint, …])     | 返回指定间隔内的等间隔数字。
|  logspace(start, stop[, num, endpoint, base, …])  |  返回数以对数刻度均匀分布。  
|  geomspace(start, stop[, num, endpoint, …])    | 返回数字以对数刻度(几何级数)均匀分布。       
|  meshgrid(*xi, **kwargs)         | 从坐标向量返回坐标矩阵。 
| mgridnd_grid            | 实例,它返回一个密集的多维 “meshgrid”
| ogridnd_grid            | 实例,它返回一个开放的多维 “meshgrid”
        

2、从现有的数据创建


      方法            描   述
| array(object[, dtype, copy, order, subok, ndmin]) | 创建一个数组
| asarray(a[, dtype, order])       | 将输入转换为数组
| asanyarray(a[, dtype, order])      | 将输入转换为ndarray,但通过ndarray子类
| ascontiguousarray(a[, dtype])      | 返回内存中的连续数组(ndim > = 1)(C顺序)
| asmatrix(data[, dtype])        | 将输入解释为矩阵
| copy(a[, order])         | 返回给定对象的数组副本
| frombuffer(buffer[, dtype, count, offset])   | 将缓冲区解释为一维数组
| fromfile(file[, dtype, count, sep, offset])   | 根据文本或二进制文件中的数据构造一个数组
| fromfunction(function, shape, **kwargs)    | 通过在每个坐标上执行一个函数来构造一个数组
| fromiter(iterable, dtype[, count])     | 从可迭代对象创建一个新的一维数组
| fromstring(string[, dtype, count, sep])    | 从字符串中的文本数据初始化的新一维数组
| loadtxt(fname[, dtype, comments, delimiter, …])  | 从文本文件加载数据

3、创建矩阵


    方法                                 |     描 述  
| mat(data[, dtype])           | 将输入解释为矩阵
| bmat(obj[, ldict, gdict])         | 从字符串,嵌套序列或数组构建矩阵对象
|  tril(m[, k])           |  数组的下三角。                               
|  triu(m[, k])           |  数组的上三角。                               
|  vander(x[, N, increasing])        | 生成范德蒙矩阵        
|  diag(v[, k])           |  提取对角线或构造对角线数组。                 
|  diagflat(v[, k])          |  使用展平的输入作为对角线创建二维数组。       
|  tri(N[, M, k, dtype])         |  在给定对角线处及以下且在其他位置为零的数组。 

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。如有错误或未考虑完全的地方,望不吝赐教。

--结束END--

本文标题: nditer—numpy.ndarray 多维数组的迭代操作

本文链接: https://www.lsjlt.com/news/125509.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • nditer—numpy.ndarray 多维数组的迭代操作
    1. Single array iteration >>> a = np.arange(6).reshape(2,3) >>> for x i...
    99+
    2022-11-12
  • JavaScript数组迭代find和findIndex操作的方法
    这篇“JavaScript数组迭代find和findIndex操作的方法”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收...
    99+
    2022-10-19
  • JavaScript数组迭代every和some的操作方法
    这篇文章主要介绍了JavaScript数组迭代every和some的操作方法的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JavaScript数组迭代every和some的操作...
    99+
    2022-10-19
  • NumPy实现ndarray多维数组操作
    目录简介 创建ndarray ndarray的属性 ndarray中元素的类型转换 ndarray的数学运算 index和切片 基本使用 index with slice boole...
    99+
    2022-11-12
  • numpy如何优化编程算法中的数组迭代操作?
    NumPy是Python中用于科学计算的一个重要库。它提供了高效的数组操作和数学函数,可以帮助我们快速进行计算和处理数据。在编程算法中,经常需要对数组进行迭代操作,而NumPy提供的函数可以优化这些操作,提高程序的效率。本文将介绍NumPy...
    99+
    2023-11-12
    数组 编程算法 numpy
  • 怎么用JavaScript数组迭代方法对每个数组项进行操作
    这篇文章主要讲解了“怎么用JavaScript数组迭代方法对每个数组项进行操作”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用JavaScript数组迭...
    99+
    2022-10-19
  • NumPy实现多维数组中的线性代数
    目录简介图形加载和说明图形的灰度灰度图像的压缩原始图像的压缩总结简介 本文将会以图表的形式为大家讲解怎么在NumPy中进行多维数据的线性代数运算。 多维数据的线性代数通常被用在图像...
    99+
    2022-11-12
  • 下标操作符重载模拟多维数组详解
    最近在写游戏,就以地图类模版为例说明如何模拟多维数组吧!复制代码 代码如下:    template <typename T_CELL_STYLE...
    99+
    2022-11-15
    下标操作符重载 多维数组
  • Go语言中的框架是否支持多维数组操作?
    Go语言是一门快速发展的编程语言,因其高效和易用性而备受欢迎。在许多情况下,我们需要使用多维数组来处理数据,那么在Go语言中的框架是否支持多维数组操作呢?本文将深入探讨这个问题,并提供一些演示代码。 首先,我们需要了解Go语言中的多维数组。...
    99+
    2023-07-19
    关键字 框架 数组
  • NumPy怎么实现多维数组中的线性代数
    本篇内容介绍了“NumPy怎么实现多维数组中的线性代数”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目录简介图形加载和说明图形的灰度灰度图像...
    99+
    2023-06-20
  • Python 的数组操作速度有多快?
    在 Python 中,数组是一种基本数据类型,它是一种有序的、可变的集合,用于存储同类型的数据。Python 中的数组操作非常灵活,支持多种操作,比如增删改查等。但是,由于 Python 是一种解释型语言,它的执行速度相对于编译型语言来说...
    99+
    2023-07-30
    数组 文件 ide
  • PHP8中的数组函数:array_intersect_assoc()的多种操作示例
    PHP语言作为一种广泛应用于Web开发和服务器端脚本编程的语言,其强大的数组函数支持是其优秀性能的重要组成部分之一。在PHP8中,新的数组函数array_intersect_assoc()被引入,它在操作关联数组时具有更高效的性能和更方便的...
    99+
    2023-05-18
    PHP 数组函数 array_intersect_assoc()
  • PHP8中的数组函数:array_replace()的多种操作方法
    PHP8中的数组函数:array_replace()的多种操作方法在开发Web应用程序时,数组是不可避免的数据类型之一。PHP提供了很多数组函数,其中,array_replace()函数是一个非常强大且有用的函数。它可以用于合并多个数组,替...
    99+
    2023-05-18
    PHP 数组函数 array_replace()
  • PHP8中的数组函数:array_slice()的多种操作技巧
    在 PHP8 中,数组是一种非常常见的数据结构,经常被用来存储和处理数据。其中,array_slice() 函数是一个强大的工具,可以对数组进行切片、截取和分割。本文将介绍该函数的多种操作技巧,帮助开发者更好地利用它。1.切片操作array...
    99+
    2023-05-15
    PHP 数组函数 array_slice()
  • python 将numpy维度不同的数组相加相乘操作
    第一种 np矩阵可以直接与标量运算 >>>import numpy as np >>>arr1 = np.arange(12).reshape...
    99+
    2022-11-11
  • python 实现二维数组的索引、删除、拼接操作
    1.数组的索引 我用的是iloc函数。导入数据是data,索引data.iloc[i,j],i代表行,j代表列。如果要索引i行之后的所有行元素,使用data.iloc[i:,j], i行之前的所有行,使用data.i...
    99+
    2022-06-02
    python 二维数组索引 二维数组删除 二维数组拼接
  • PHP7中的迭代器:如何更高效地遍历和操作数据集?
    PHP7中的迭代器:如何更高效地遍历和操作数据集?在PHP7中,迭代器是一个非常强大的概念,它可以让我们更高效地遍历和操作数据集。迭代器可以简化代码结构,提高代码的可读性和可维护性。本文将介绍PHP7中的迭代器概念,并提供一些具体的代码示例...
    99+
    2023-10-22
    迭代器 操作 遍历
  • PHP如何实现二维数组中行和列的替换操作
    PHP中使用二维数组十分常见,不过在进行一些操作时可能需要对二维数组的行或列进行替换。本文将介绍在PHP中如何实现二维数组的行和列的替换操作。一、PHP二维数组二维数组是由多个一维数组组成的数组,可以想象成是一个表格。在PHP中可以使用ar...
    99+
    2023-05-14
  • 如何进行Python矩阵转置中的二维数组的实际操作
    本篇文章给大家分享的是有关如何进行Python矩阵转置中的二维数组的实际操作,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。如果你对Python矩阵转置的实际应用操作方案的转置不...
    99+
    2023-06-17
  • PHP7中的迭代器:如何高效地遍历和操作大规模数据集?
    PHP7中的迭代器:如何高效地遍历和操作大规模数据集?引言:随着互联网和数据科学的快速发展,处理大规模数据集成为了很多开发者和数据分析师的常见需求。PHP7中的迭代器是一种强大的工具,可以帮助我们高效地遍历和操作大规模数据集。本文将介绍PH...
    99+
    2023-10-22
    迭代器 大规模数据集 高效遍历
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作