如何找到矢量化矩阵numpy的索引

时间:2016-04-14 06:48:19

标签: python numpy matrix

我有一个numpy(n x n x n)的ndmatrix,为了以特定的方式对我的数据进行一些采样,我进行了矢量化,给了我(1 x n ^ 3)。

我想采用单个矢量化索引并将它们转换回形式为(n x n x n)的n维索引。我不确定实际上有多么颠簸矢量化矩阵。

有人可以提供建议吗?

1 个答案:

答案 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')