我有一个numpy(n x n x n)的ndmatrix,为了以特定的方式对我的数据进行一些采样,我进行了矢量化,给了我(1 x n ^ 3)。
我想采用单个矢量化索引并将它们转换回形式为(n x n x n)的n维索引。我不确定实际上有多么颠簸矢量化矩阵。
有人可以提供建议吗?
答案 0 :(得分:4)
Numpy有一个函数unravel_index
几乎可以做到这一点:给出一套“平坦”的函数。 index,它将返回每个维度中索引数组的元组:
>>> indices = np.arange(25, dtype=int)
>>> np.unravel_index(indices, (5, 5))
(array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4,
4, 4], dtype=int64),
array([0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2,
3, 4], dtype=int64))
然后,您可以zip
获取原始索引。
请注意,矩阵可以表示为'行序列' (C惯例,'C'
)或'列序列' (Fortran惯例,'F'
),或更高维度的相应约定。 numpy中矩阵的典型扁平化将保留该顺序,因此[[1, 2], [3, 4]]
可以展平为[1, 2, 3, 4]
(如果它具有' C'顺序)或[1, 3, 2, 4]
(如果有' F'命令)。如果您想更改默认值({C'),unravel_index
会选择order
参数,因此您可以这样做:
>>> # Typically, transposition will change the order for
>>> # efficiency reasons: no need to change the data !
>>> n = np.random.random((2, 2, 2)).transpose()
>>> n.flags.f_contiguous
True
>>> n.flags.c_contiguous
False
>>> x, y, z = np.unravel_index([1,2,3,7], (2, 2, 2), order='F')