将平面1D矩阵转换为方阵

时间:2018-06-19 02:01:17

标签: numpy matrix

是否存在转换以下n x 1矩阵的方法/代码,

x1
x2
x3
x4
x5
x6
x7
x8
x9
x10

进入形式的方阵,

x1 x2 x4 x7 
x2 x3 x5 x8
x4 x5 x6 x9
x7 x8 x9 x10

我有一个903 x 1矩阵(以.csv格式),我希望将其转换为42 x 42矩阵,其格式如图所示。谢谢!

2 个答案:

答案 0 :(得分:1)

我想我应该等到你编辑问题,但我继续看着这个数字。它看起来像一个基于三上和下三维矩阵的对称矩阵。什么dicispline被称为“完整矩阵”?

无论如何这里有一个产生你的形象的序列:

In [93]: idx=np.tril_indices(4)
In [94]: idx
Out[94]: (array([0, 1, 1, 2, 2, 2, 3, 3, 3, 3]), array([0, 0, 1, 0, 1, 2, 0, 1, 2, 3]))
In [95]: arr = np.zeros((4,4),int)
In [96]: arr[idx] = np.arange(1,11)
In [97]: arr
Out[97]: 
array([[ 1,  0,  0,  0],
       [ 2,  3,  0,  0],
       [ 4,  5,  6,  0],
       [ 7,  8,  9, 10]])
In [98]: arr1 = arr + arr.T
In [99]: arr1
Out[99]: 
array([[ 2,  2,  4,  7],
       [ 2,  6,  5,  8],
       [ 4,  5, 12,  9],
       [ 7,  8,  9, 20]])
In [100]: dx = np.diag_indices(4)
In [101]: dx
Out[101]: (array([0, 1, 2, 3]), array([0, 1, 2, 3]))
In [102]: arr1[dx] = arr[dx]
In [103]: arr1
Out[103]: 
array([[ 1,  2,  4,  7],
       [ 2,  3,  5,  8],
       [ 4,  5,  6,  9],
       [ 7,  8,  9, 10]])

这类似于scipy.spatial为成对距离调用squareform的内容。

https://docs.scipy.org/doc/scipy-0.15.1/reference/generated/scipy.spatial.distance.squareform.html#scipy.spatial.distance.squareform

In [106]: from scipy.spatial import distance
In [107]: distance.squareform(np.arange(1,11))
Out[107]: 
array([[ 0,  1,  2,  3,  4],
       [ 1,  0,  5,  6,  7],
       [ 2,  5,  0,  8,  9],
       [ 3,  6,  8,  0, 10],
       [ 4,  7,  9, 10,  0]])

看来这个square_form使用已编译的代码,所以我希望它比我的tril基本代码快一点。但元素的顺序并不是你所期望的。

答案 1 :(得分:0)

Numpy有一个重塑阵列的功能 - https://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html

>>> np.reshape(a, (2, 3)) # C-like index ordering
array([[0, 1, 2],
       [3, 4, 5]])