2017-09-11 4 views
0

numpy 인 테이블에서 행렬을 만드는 가장 간단한 방법은 무엇입니까? 나는 1 열이 x이고, 2 번째가 y이고 3 번째가 z 인 값의 테이블을 가지고있다. z 값이 모두 고유 한 경우 (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)는 다음 x 어떤 y와의 길이, 중복의 reshape(Z)을 제거하는 여기 예입니다 vstackhstackx, 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 및 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.]]) 
+0

고마워,하지만 불행히도 그것이 내가 원하는 것만은 아니다. 행렬에 x와 y가있는 z 행렬이 필요합니다. – Kirill

+0

나는 색인을 제공하기 위해 답을 편집했습니다 (요소 0-0은 어쨌든 다소 임의적입니다)! :) 팬더가있는 솔루션은 아마도 더 깨끗합니다. 그러나 이것은 팬더가 scipy를 필요로하므로 추가 의존성을 피할 수 있습니다. – matteo

+0

감사합니다. 이것은 예상대로 깨끗하지는 않지만 가장 컴팩트 한 방법입니다 내가 멍청한 녀석이 필요로하는 것을하기. – 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 팬더가 있다면 다른 대답을 사용하지 않아도된다고 생각합니다. 그러나 그것은 당신에게 달려 있습니다. –

관련 문제