使用numpy
从表格制作矩阵的最简洁方法是什么?
我有一个值表,第一列是x
,第二列是y
,第三列是z
。 z
值都是唯一的,(x, y)
对是使用x
和y
的组合获得的。这是一个例子:
0.0 0.0 949219540.0
0.0 0.5 944034910.0
0.0 1.0 938508543.0
0.0 1.5 930093905.0
0.0 2.0 922076484.0
50.0 0.0 911497861.0
50.0 0.5 903224763.0
50.0 1.0 900406431.0
50.0 1.5 890658529.0
50.0 2.0 880907404.0
100.0 0.0 883527077.0
100.0 0.5 911683042.0
........ # and so on
基本上这是一个矩阵5x9
:
0.0 0.0 0.5 1.0 1.5 2.0
0.0 0.949 0.944 0.939 0.93 0.922
50.0 0.911 0.903 0.9 0.891 0.881
100.0 0.884 0.912 0.84 0.839 0.851
150.0 0.85 0.84 0.799 0.844 0.863
200.0 0.84 0.79 0.806 0.847 0.745
250.0 0.789 0.78 0.748 0.719 0.759
300.0 0.761 0.783 0.714 0.766 0.698
350.0 0.737 0.757 0.792 0.705 0.665
400.0 0.801 0.797 0.57 0.628 0.532
现在为此我制作了set(x)
和set(y)
来删除重复项,reshape(Z)
长度为x
任意y
然后{{1} }和vstack
连接hstack
。我相信这是数据处理中非常常见的操作,也许它有一步到位的解决方案。更重要的是,当x, y, z
和x
不合规时,我的方式并不好,因此y
可以打破矩阵逻辑。
答案 0 :(得分:0)
这基本上与numpy.meshgrid
相反。
对于单行,您可以使用scipy.interpolate.griddata
:
grid = griddata(list(zip(x, y)), z,
(x.reshape((len(set(y)), len(set(x)))),
y.reshape((len(set(y)), len(set(x))))),
method='nearest')
更长的演示:假设我们有一个完全覆盖矩阵的条目列表。在numpy
中,这是通过meshgrid
In [1]: import numpy as np
In [2]: a = np.arange(0, 5)
In [3]: b = np.arange(6, 9)
In [4]: aa, bb = np.meshgrid(a, b)
并为网格的每个元素指定值:
IN [5]: x, y = aa.flatten(), bb.flatten()
In [6]: z = np.ones(len(x))
这些是OP的起始x,y和z。
现在让我们使用网格数据将所有值都放入矩阵中。 griddata
比这更强大,但每个网格只有一个点和一个明显等间距的网格,矩阵就是精确的。
In [7]: points = list(zip(x, y))
In [8]: from scipy.interpolate import griddata
In [9]: grid = griddata(points, z,
(x.reshape((len(set(y)), len(set(x)))),
y.reshape((len(set(y)), len(set(x))))),
method='nearest')
In [10]: grid
Out[10]:
array([[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]])
In [11]: a, b = set(x), set(y)
In [12]: np.hstack((np.concatenate(([0], b)).reshape((1, len(b) + 1)).T, np.vstack((a, grid))))
Out[12]:
array([[ 0., 0., 1., 2., 3., 4.],
[ 6., 1., 1., 1., 1., 1.],
[ 7., 1., 1., 1., 1., 1.],
[ 8., 1., 1., 1., 1., 1.]])