跟踪 numpy.reshape 中的指数变化
keeping track of indices change in numpy.reshape
在 Python 中使用 numpy.reshape
时,有没有办法跟踪索引的变化?
例如,如果将形状为 (m,n,l,k)
的 numpy 数组重新整形为形状为 (m*n,k*l)
的数组;有没有办法获取当前 [X,Y]
索引的初始索引 ([x,y,w,z]
),反之亦然?
你不跟踪它,但你可以计算它。原始 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)
是的,它叫做 raveling
and unraveling
索引。例如你有两个数组:
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)
在 Python 中使用 numpy.reshape
时,有没有办法跟踪索引的变化?
例如,如果将形状为 (m,n,l,k)
的 numpy 数组重新整形为形状为 (m*n,k*l)
的数组;有没有办法获取当前 [X,Y]
索引的初始索引 ([x,y,w,z]
),反之亦然?
你不跟踪它,但你可以计算它。原始 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)
是的,它叫做 raveling
and unraveling
索引。例如你有两个数组:
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)