Unravel Index numpy -自己的实现

tez616oj  于 2023-10-19  发布在  其他
关注(0)|答案(2)|浏览(109)

我尝试自己实现np.unravel_indexnp.ravel_multi_index。对于np.ravel_multi_index,我可以写这个简短的函数:

def coord2index(coord, shape):
    return np.concatenate((np.asarray(shape[1:])[::-1].cumprod()[::-1],[1])).dot(coord)

但我很难找到一个类似的,简短的(一行程序)函数np.unravel_index。有人有主意吗?

9rbhqvlz

9rbhqvlz1#

这是一种可能的实现方式:

import numpy as np

def index2coord(index, shape):
    return ((np.expand_dims(index, 1) // np.r_[1, shape[:0:-1]].cumprod()[::-1]) % shape).T

shape = (2, 3, 4)
coord = [[0, 1], [2, 0], [1, 3]]
print(index2coord(coord2index(coord, shape), shape))
# [[0 1]
#  [2 0]
#  [1 3]]
rggaifut

rggaifut2#

我有一个简短的实现,不使用numpy,但目前只适用于单个索引,而不是像numpy.unravel_index()那样的一组索引。

def index2coord(index: int, shape: tuple) -> tuple:

    coords = list()
    
    for dim_size in shape:
        coords.append(index % dim_size)  # remainder
        index //= dim_size  # quotient
    
    return tuple(coords)

注意:我觉得“on my own”意味着不使用numpy,否则如果你被允许使用numpy,为什么不直接调用numpy.unravel_index()呢?

相关问题