Python 行主序到列主序向量
Python row major to column major order vector
有一个像
这样的矩阵
ma = [[0.343, 0.351, 0.306], [0.145, 0.368, 0.487]]
我想得到一个像这样的向量:
[0.343, 0.145, 0.351, 0.368, 0.306, 0.487]
为了尝试获取它,我正在使用 numpy
和 reshape
但它不起作用。
a = np.array(ma)
>>> print a.shape
(2, 3)
但我得到:
c = a.reshape(3, 2, order='F')
>>> print c
array([[ 0.343, 0.368],
[ 0.145, 0.306],
[ 0.351, 0.487]])
对于任何矩阵大小,最好的方法是什么?我的意思是,例如,如果矩阵不是像这样平方的:
[[0.404, 0.571, 0.025],
[0.076, 0.694, 0.230],
[0.606, 0.333, 0.061],
[0.595, 0.267, 0.138]]
我想得到:
[0.404, 0.076, 0.606, 0.595, 0.571, 0.694, 0.333, 0.267, 0.025, 0.230, 0.061, 0.138]
你可以通过转置矩阵然后使用 numpy's ravel function:
来得到你想要的
mat = np.random.rand(3,2)
print np.ravel(mat.T)
以 Fortran 顺序展平数组:
c = a.flatten(order='F')
您也可以使用 reshape
获得您想要的结果,但它比较冗长:
c = a.reshape(a.size, order='F')
您可以使用 ravel()
来展平数组。
>>> a.T.ravel()
array([ 0.343, 0.145, 0.351, 0.368, 0.306, 0.487])
# Or specify Fortran order.
>>> a.ravel('F')
array([ 0.343, 0.145, 0.351, 0.368, 0.306, 0.487])
a = np.random.rand(4,2)
>>> a
array([[ 0.59507926, 0.25011282],
[ 0.68171766, 0.41653172],
[ 0.83888691, 0.22479481],
[ 0.04540208, 0.23490886]])
>>> a.T.ravel() # or a.ravel('F')
array([ 0.59507926, 0.68171766, 0.83888691, 0.04540208, 0.25011282,
0.41653172, 0.22479481, 0.23490886])
>>> A = ([[0, 1, 2],
... [3, 4, 5],
... [6, 7, 8]])
>>>
>>> print(A)
[[0, 1, 2], [3, 4, 5], [6, 7, 8]]
>>>
>>> [y for x in [[row[i] for row in A] for i in range(len(A[0]))] for y in x]
[0, 3, 6, 1, 4, 7, 2, 5, 8]
>>>
>>>
有一个像
这样的矩阵ma = [[0.343, 0.351, 0.306], [0.145, 0.368, 0.487]]
我想得到一个像这样的向量:
[0.343, 0.145, 0.351, 0.368, 0.306, 0.487]
为了尝试获取它,我正在使用 numpy
和 reshape
但它不起作用。
a = np.array(ma)
>>> print a.shape
(2, 3)
但我得到:
c = a.reshape(3, 2, order='F')
>>> print c
array([[ 0.343, 0.368],
[ 0.145, 0.306],
[ 0.351, 0.487]])
对于任何矩阵大小,最好的方法是什么?我的意思是,例如,如果矩阵不是像这样平方的:
[[0.404, 0.571, 0.025],
[0.076, 0.694, 0.230],
[0.606, 0.333, 0.061],
[0.595, 0.267, 0.138]]
我想得到:
[0.404, 0.076, 0.606, 0.595, 0.571, 0.694, 0.333, 0.267, 0.025, 0.230, 0.061, 0.138]
你可以通过转置矩阵然后使用 numpy's ravel function:
来得到你想要的mat = np.random.rand(3,2)
print np.ravel(mat.T)
以 Fortran 顺序展平数组:
c = a.flatten(order='F')
您也可以使用 reshape
获得您想要的结果,但它比较冗长:
c = a.reshape(a.size, order='F')
您可以使用 ravel()
来展平数组。
>>> a.T.ravel()
array([ 0.343, 0.145, 0.351, 0.368, 0.306, 0.487])
# Or specify Fortran order.
>>> a.ravel('F')
array([ 0.343, 0.145, 0.351, 0.368, 0.306, 0.487])
a = np.random.rand(4,2)
>>> a
array([[ 0.59507926, 0.25011282],
[ 0.68171766, 0.41653172],
[ 0.83888691, 0.22479481],
[ 0.04540208, 0.23490886]])
>>> a.T.ravel() # or a.ravel('F')
array([ 0.59507926, 0.68171766, 0.83888691, 0.04540208, 0.25011282,
0.41653172, 0.22479481, 0.23490886])
>>> A = ([[0, 1, 2],
... [3, 4, 5],
... [6, 7, 8]])
>>>
>>> print(A)
[[0, 1, 2], [3, 4, 5], [6, 7, 8]]
>>>
>>> [y for x in [[row[i] for row in A] for i in range(len(A[0]))] for y in x]
[0, 3, 6, 1, 4, 7, 2, 5, 8]
>>>
>>>