ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python-在NumPy中跟踪多索引和修改值

2019-10-25 10:58:31  阅读:399  来源: 互联网

标签:multi-index iteration numpy-ndarray python numpy


我正在迭代一个2D数组,以使用索引值进行计算,然后将计算出的值分配给所述索引.

在NumPy文档中,提供了an example用于使用迭代器修改值:

for x in np.nditer(a, op_flags=['readwrite']):
    x[...] = 2 * x

但是,当使用the following method跟踪索引时,这似乎不起作用:

it = np.nditer(a, flags=['multi_index'])
while not it.finished:
    it[...] = . . .
    it.iternext()

但是,我可以使用it.multi_index值,但这似乎不必要.是否有更简单的方法可以通过不同的方法或不同的语法来实现?

it = np.nditer(a, flags=['multi_index'])
while not it.finished:
    matrix[it.multi_index[0]][it.multi_index[1]] = . . .
    it.iternext()

编辑

这是一个multi_index迭代的示例,该迭代尝试使用迭代器索引和失败来修改值.

matrix = np.zeros((5,5))
it = np.nditer(matrix, flags=['multi_index'])
while not it.finished:
  it[...] = 1
  it.iternext()

产生的错误是

TypeError                                 Traceback (most recent call last)
<ipython-input-79-3f4cabcbfde6> in <module>()
     25 it = np.nditer(matrix, flags=['multi_index'])
     26 while not it.finished:
---> 27   it[...] = 1
     28   it.iternext()

TypeError: invalid index type for iterator indexing

解决方法:

在您的第一个迭代示例中:

In [1]: arr = np.arange(12).reshape(3,4)
In [2]: for x in np.nditer(arr, op_flags=['readwrite']):
   ...:     print(x, type(x))
   ...:     x[...] = 2 * x
   ...:     
0 <class 'numpy.ndarray'>
1 <class 'numpy.ndarray'>
2 <class 'numpy.ndarray'>
3 <class 'numpy.ndarray'>
4 <class 'numpy.ndarray'>
....
11 <class 'numpy.ndarray'>
In [3]: x
Out[3]: array(22)
In [4]: arr
Out[4]: 
array([[ 0,  2,  4,  6],
       [ 8, 10, 12, 14],
       [16, 18, 20, 22]])

打开multi_index:

In [9]: it = np.nditer(arr, flags=['multi_index'],op_flags=['readwrite'])
In [10]: while not it.finished:
    ...:     print(it[0], it.multi_index)
    ...:     it.iternext()
    ...:     
0 (0, 0)
2 (0, 1)
4 (0, 2)
...
20 (2, 2)
22 (2, 3)

通过arr的元素进行相同的迭代,但是还会生成2d索引元组.它是nditer对象,具有各种方法和属性.在这种情况下,它具有multi_index属性.和当前迭代变量是在它[0].

我可以使用[…]就位或通过在arr中建立索引来修改元素:

In [11]: it = np.nditer(arr, flags=['multi_index'],op_flags=['readwrite'])
In [13]: while not it.finished:
    ...:     it[0][...] *= 2
    ...:     arr[it.multi_index] += 100
    ...:     it.iternext()
    ...:     

In [14]: arr       # values are doubled and add by 100
Out[14]: 
array([[100, 104, 108, 112],
       [116, 120, 124, 128],
       [132, 136, 140, 144]])

没有multi_index,我仍然可以创建一个nditer对象,并使用未完成的语法进行迭代.而不是访问x […],我不得不使用它[0] […].

np.ndindex是一种生成multi_index的更方便的方法.看一下它的代码.它是使用np.nditer的少数numpy函数之一.

In [26]: for idx in np.ndindex(arr.shape):
    ...:     print(idx)
    ...:     arr[idx] -= 100
    ...:     
(0, 0)
(0, 1)
...
(2, 3)
In [27]: arr
Out[27]: 
array([[ 0,  4,  8, 12],
       [16, 20, 24, 28],
       [32, 36, 40, 44]])

尽管与nditer一起玩很有趣,但它并不实际,至少在纯Python代码中不是这样.作为在cython或纯c代码中使用它的垫脚石,它最有用.请参阅迭代页面的最终示例.

标签:multi-index,iteration,numpy-ndarray,python,numpy
来源: https://codeday.me/bug/20191025/1928092.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有