2017-09-11 41 views
0

numpy的表格製作矩陣的最簡潔方法是什麼? 我有一個值的表格,其中第一列是x,第二個是y和第三個是zz值都是唯一的,(x, y)對用xy的組合獲得。下面是一個例子:根據其列中的值重塑NumPy數組

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然後長度vstackhstack以連接x, y, z。我相信這在數據處理中是相當常見的操作,也許它有一步式解決方案。更重要的是,我的方式並不好,xy不是爲了,所以set()可以打破矩陣邏輯。

+0

你有熊貓嗎?這是一個有熊貓的班輪。 –

+0

我想看熊貓解決方案。 – Kirill

回答

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)) 

這些起始X,Y,和OP的Ž。 現在讓我們使用網格數據將所有值都存入矩陣。 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.]]) 
+0

謝謝,但不幸的是,這不完全是我需要的。我需要在行和列上使用x和y的z矩陣。 – Kirill

+0

我編輯的答案給你的指數(元素0-0有點武斷無論如何)! :) 熊貓的解決方案可能是更清潔的,但這可以讓你避免額外的依賴(因爲熊貓無論如何都需要scipy) – matteo

+0

謝謝,儘管這並不像我想象的那麼幹淨,但看起來這是最緊湊的方式做我需要與numpy。 – Kirill

0

說,你有一個文件numbers.dat

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 

讀入數據與read_csv和使用df.pivot重塑。

df = pd.read_csv('numbers.dat', delim_whitespace=True, header=None, names=['x', 'y', 'z']) 
df.z /= 10e8 

df 

     x y   z 
0 0.0 0.0 0.949220 
1 0.0 0.5 0.944035 
2 0.0 1.0 0.938509 
3 0.0 1.5 0.930094 
4 0.0 2.0 0.922076 
5 50.0 0.0 0.911498 
6 50.0 0.5 0.903225 
7 50.0 1.0 0.900406 
8 50.0 1.5 0.890659 
9 50.0 2.0 0.880907 

df = df.pivot('x', 'y', values='z').reset_index() 
df 

y  x  0.0  0.5  1.0  1.5  2.0 
0 0.0 0.949220 0.944035 0.938509 0.930094 0.922076 
1 50.0 0.911498 0.903225 0.900406 0.890659 0.880907 

df.values 

array([[ 0.  , 0.94921954, 0.94403491, 0.93850854, 
      0.9300939 , 0.92207648], 
     [ 50.  , 0.91149786, 0.90322476, 0.90040643, 
      0.89065853, 0.8809074 ]]) 
+0

非常好!謝謝! – Kirill

+0

@Kirill如果你有熊貓,我不認爲你應該使用其他答案。但這取決於你。 –