我如何获得矩阵元素的一维索引?
例如:
b=np.array([1, 2, 3, 4, 5, 6])
c = b.reshape(2,3,order='F')#colmaj
d = b.reshape(2,3)#rowmaj
这是c:
([[1, 3, 5],
[2, 4, 6]])
这是d:
([[1, 2, 3],
[4, 5, 6]])
如果我做c [1,2],我得到元素6,并且我需要得到一维数组的索引,该索引将是5。我可以在头脑中做到这一点,但是如果我有一个大矩阵并且需要随机选择一个元素我将无法。我需要为colmajor和rowmajor矩阵编写函数来做到这一点。
def linearize_colmajor(i, j, m, n):
"""
Returns the linear index for the `(i, j)` entry of
an `m`-by-`n` matrix stored in column-major order.
"""
答案 0 :(得分:1)
只需按列数缩放行索引,然后为行优先顺序添加列索引。对于大订单,请使用行数来缩放行索引并再次添加列索引。
因此,要获取rowmaj
版本的扁平索引-
i*n+j
要获取colmaj
版本的扁平索引-
i*m+j
其中:
i = row index
j = col index
m = number of rows in the matrix
n = number of columns in the matrix
放入函数格式-
def linearize(i, j, m, n, order='C'):
if order=='C': # rowmaj
return i*n+j
elif order=='F': # colmaj
return i*m+j
else:
raise Exception("Invalid order value")
样品运行-
In [42]: linearize(i=1, j=1, m=2, n=3, order='C')
Out[42]: 4 # element : 5 in rowmaj array, d
In [43]: linearize(i=1, j=1, m=2, n=3, order='F')
Out[43]: 3 # element : 4 in colmaj array, c
答案 1 :(得分:0)
np.ravel_multi_index
将n-d索引转换为平面索引,并可以选择指定order
:
In [152]: np.ravel_multi_index((0,2),(2,3),order='C')
Out[152]: 2
In [153]: c[0,2], c.flat[2]
Out[153]: (5, 5)
对order='F'
案例的应用有点棘手:
In [154]: np.ravel_multi_index([0,2],[2,3],order='F')
Out[154]: 4
In [155]: d[0,2], d.flat[4], d.ravel(order='F')[4]
Out[155]: (3, 5, 3)
In [156]: d.ravel()
Out[156]: array([1, 2, 3, 4, 5, 6])
In [157]: d.ravel(order='F')
Out[157]: array([1, 4, 2, 5, 3, 6])
[1,2]
元素在两个顺序中都相同,最后一个为“ 6”。
与@Divakar的示例进行比较:
In [160]: np.ravel_multi_index([1,1],[2,3],order='C')
Out[160]: 4
In [161]: np.ravel_multi_index([1,1],[2,3],order='F')
Out[161]: 3