matlab有两个将矩阵下标转换为线性指数的函数,反之亦然。(ind2sub和sub2ind)
我找到了r的等价物,但是在python中有等价的方法吗?

最佳答案

谷歌搜索会引导我找到这个链接:https://github.com/jjakeman/pyheat/blob/master/utilities/math_utils.py
据我所知,这些函数在matlab中没有直接实现。
结果发现我不能正确阅读文档。如果您想要sub2ind的功能,您需要ravel_multi_index功能。函数声明表示需要两个输入。第一个输入是一个2dnumpy数组,其中每一行是特定维度的位置。例如,如果要在二维矩阵上应用ind2sub,可以指定一个2dnumpy数组,其中第一行由所需的所有行位置组成,第二行由所需的所有列位置组成。第二个输入是确定每个维度大小的元组,因此对于二维数组,它将是行数和列数。
要执行ind2sub操作,您需要使用unravel_index功能。第一个输入是一个线性索引数组,您希望将其转换为数组中每个维度的位置。第二个输入是和以前一样的维度元组。
我将把这个职位放在最底层留给子孙后代,以防你自己尝试实现这些。
但是,您当然可以自己实现这些功能。我假设这是因为你在你的帖子上贴上了numpy标签,你会想要一个numpy风格的解决方案。记住,在numpy中,您访问的是row major中的元素,而不是column major,因此给定两个数组,一个用于row,另一个用于column indexes(0-indexed),对于2d矩阵sub2ind非常简单:

def sub2ind(array_shape, rows, cols):
    return rows*array_shape[1] + cols

array_shape是两个元素的数组,其中第一个元素是矩阵中的行数,第二个元素是列数。如果您还记得,您可以通过以下方式访问行主矩阵中的元素:
ind = r*cols + c

(r,c)是所需的行和列索引,前提是它是0索引的。相反,您将使用整数除法和模数:
def ind2sub(array_shape, ind):
    rows = (ind.astype('int') / array_shape[1])
    cols = (ind.astype('int') % array_shape[1]) # or numpy.mod(ind.astype('int'), array_shape[1])
    return (rows, cols)

这里,输出是一个两元素元组,其中第一个元素是行位置,第二个元素是列位置。要总结ind2sub,若要访问所需的行,请获取线性索引并对列进行整数除。要得到所需的列,可以找到模数或余数。向三维方向前进会更复杂一些。我让你看看我上面提到的链接,了解更多细节。
显然,我没有在上面的函数中放置任何错误检查,因此在这种情况下,您显然会使用array_shape来提高自己的优势。做你想做的事情的更好方法是:
def sub2ind(array_shape, rows, cols):
    ind = rows*array_shape[1] + cols
    ind[ind < 0] = -1
    ind[ind >= array_shape[0]*array_shape[1]] = -1
    return ind

def ind2sub(array_shape, ind):
    ind[ind < 0] = -1
    ind[ind >= array_shape[0]*array_shape[1]] = -1
    rows = (ind.astype('int') / array_shape[1])
    cols = ind % array_shape[1]
    return (rows, cols)

我做了一些基本的错误检查以确保sub2ind的行或列或ind2sub的线性索引都不超出界限。我把这些地点设为-1,这样你就知道你在什么地方搞砸了。
祝你好运!

10-07 15:09