根据列中的值重塑NumPy数组

时间:2017-09-11 09:16:32

标签: python arrays pandas numpy

使用numpy从表格制作矩阵的最简洁方法是什么? 我有一个值表,第一列是x,第二列是y,第三列是zz值都是唯一的,(x, y)对是使用xy的组合获得的。这是一个例子:

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, zx不合规时,我的方式并不好,因此y可以打破矩阵逻辑。

1 个答案:

答案 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.]])