2024-04-19 16:23:33 发布
网友
我想你想要ravel_multi_index和unravel_index
一个谷歌搜索引导我到这个链接:https://github.com/jjakeman/pyheat/blob/master/utilities/math_utils.py
据我所知,这些函数在MATLAB中没有直接实现。
结果我看不懂文件。如果您想要sub2ind的功能,那么您需要^{}函数。函数声明说您需要两个输入。第一个输入是2Dnumpy数组,其中每一行是特定维度的位置。例如,如果要对2D矩阵应用ind2sub,可以指定2Dnumpy数组,其中第一行包含所需的所有行位置,第二行包含所需的所有列位置。第二个输入是tuple,它决定每个维度的大小,所以对于2D数组,它是行和列的数量。
sub2ind
numpy
ind2sub
要执行ind2sub,您需要^{}函数。第一个输入是要转换为数组中每个维度位置的线性索引数组。第二个输入与前面一样是维度的元组。
我将把这篇文章放在最底层留给后人,以防你想自己尝试实现这些。
然而,你当然可以自己实现这些。我假设因为你用numpy标记了你的文章,你会想要一个numpy式的解决方案。记住,在numpy中,访问rowmajor中的元素,而不是columnmajor中的元素,因此给定两个数组,一个用于row,另一个用于column index(0-indexed),sub2ind对于2D矩阵非常简单:
def sub2ind(array_shape, rows, cols): return rows*array_shape[1] + cols
array_shape是由两个元素组成的数组,其中第一个元素是矩阵中的行数,第二个元素是列数。如果您还记得,可以通过以下方式访问行主矩阵中的元素:
array_shape
ind = r*cols + c
(r,c)是所需的行和列索引,前提是它是0索引的。相反,可以使用整数除法和模数:
(r,c)
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,所以你知道你在什么地方搞砸了。
祝你好运!
基于@rayryeng和@theblackcat的答案,您还应该注意,您将不得不使用Fortran风格的索引,并记住Python是0索引的,而MATLAB是1索引的。
Fortran风格的要求让我有点受骗了。
在Python中:
np.unravel_index(7, [1, 2, 3, 4], 'F') (0, 1, 0, 1)
在MATLAB/Octave中
[a, b, c, d] = ind2sub([1, 2, 3, 4], 8) a = 1 b = 2 c = 1 d = 2
我想你想要ravel_multi_index和unravel_index
一个谷歌搜索引导我到这个链接:https://github.com/jjakeman/pyheat/blob/master/utilities/math_utils.py
据我所知,这些函数在MATLAB中没有直接实现。结果我看不懂文件。如果您想要} 函数。函数声明说您需要两个输入。第一个输入是2D
sub2ind
的功能,那么您需要^{numpy
数组,其中每一行是特定维度的位置。例如,如果要对2D矩阵应用ind2sub
,可以指定2Dnumpy
数组,其中第一行包含所需的所有行位置,第二行包含所需的所有列位置。第二个输入是tuple,它决定每个维度的大小,所以对于2D数组,它是行和列的数量。要执行} 函数。第一个输入是要转换为数组中每个维度位置的线性索引数组。第二个输入与前面一样是维度的元组。
ind2sub
,您需要^{我将把这篇文章放在最底层留给后人,以防你想自己尝试实现这些。
然而,你当然可以自己实现这些。我假设因为你用
numpy
标记了你的文章,你会想要一个numpy
式的解决方案。记住,在numpy
中,访问rowmajor中的元素,而不是columnmajor中的元素,因此给定两个数组,一个用于row,另一个用于column index(0-indexed),sub2ind
对于2D矩阵非常简单:array_shape
是由两个元素组成的数组,其中第一个元素是矩阵中的行数,第二个元素是列数。如果您还记得,可以通过以下方式访问行主矩阵中的元素:(r,c)
是所需的行和列索引,前提是它是0索引的。相反,可以使用整数除法和模数:这里,输出是一个两元素元组,其中第一个元素是行位置,第二个元素是列位置。要总结
ind2sub
,要访问所需的行,可以使用线性索引并对列进行整数除法。要得到所需的列,可以找到模数或余数。去三维和更高的是有点复杂。我会让你看一看我上面提到的链接,了解更多细节。显然,我没有在上面的函数中进行任何错误检查,因此在这种情况下,显然可以使用
array_shape
来获得优势。做你想做的事的更好的方法是:我做了一些基本的错误检查,以确保没有
sub2ind
的行或列或ind2sub
的线性索引超出界限。我把这些位置设为-1,所以你知道你在什么地方搞砸了。祝你好运!
基于@rayryeng和@theblackcat的答案,您还应该注意,您将不得不使用Fortran风格的索引,并记住Python是0索引的,而MATLAB是1索引的。
Fortran风格的要求让我有点受骗了。
在Python中:
在MATLAB/Octave中
相关问题 更多 >
编程相关推荐