跟踪numpy.reshape中的指数变化

时间:2017-01-25 00:21:56

标签: python numpy multidimensional-array indexing reshape

在Python中使用numpy.reshape时,有没有办法跟踪索引的变化?

例如,如果将形状为(m,n,l,k)的numpy数组重新整形为形状为(m*n,k*l)的数组;有没有办法获得当前[x,y,w,z]索引的初始索引([X,Y]),反之亦然?

2 个答案:

答案 0 :(得分:4)

是的,它被称为ravelingunraveling索引。例如,您有两个数组:

import numpy as np

arr1 = np.arange(10000).reshape(20, 10, 50)
arr2 = arr.reshape(20, 500)

假设您要将(10, 52)(相当于arr2[10, 52])元素编入索引,但在arr1中:

>>> np.unravel_index(np.ravel_multi_index((10, 52), arr2.shape), arr1.shape)
(10, 1, 2)

或在另一个方向:

>>> np.unravel_index(np.ravel_multi_index((10, 1, 2), arr1.shape), arr2.shape)
(10, 52)

答案 1 :(得分:1)

你没有跟踪它,但你可以计算它。原始m x n已映射到新的m*n维度,例如n*x+y == X。但我们可以使用几个多维ravel / unravel函数进行验证(由@MSeifert回答)。

In [671]: m,n,l,k=2,3,4,5
In [672]: np.ravel_multi_index((1,2,3,4), (m,n,l,k))
Out[672]: 119
In [673]: np.unravel_index(52, (m*n,l*k))
Out[673]: (2, 12)