2012-09-24 1 views
2

위도 (400,600), 위도 (400,600), 데이터 (30,400,60); 내가 뭘하려는 건지 데이터 배열 (위도와 경도)에 따라 값을 추출하는 것입니다. 여기 numpy ndarray를 축을 따라 평평하게 만드는 방법은 무엇입니까?

내 코드입니다 :

import numpy 
    import tables 

    hdf = "data.hdf5" 
    h5file = tables.openFile(hdf, mode = "r") 

    lon = numpy.array(h5file.root.Lonitude) 
    lat = numpy.array(h5file.root.Latitude) 
    arr = numpy.array(h5file.root.data) 

    lon = numpy.array(lon.flat) 
    lat = numpy.array(lat.flat) 
    arr = numpy.array(arr.flat) 

    lonlist=[] 
    latlist=[] 
    layer=[] 
    fre=[] 

    for i in range(0,len(lon)): 
     for j in range(0,30): 
      longi = lon[j] 
      lati = lat[j] 
      layers=[j] 
      frequency= arr[i] 

      lonlist.append(longi) 
      latlist.append(lati) 
      layer.append(layers) 
      fre.append(frequency) 

    output = numpy.column_stack((lonlist,latlist,layer,fre)) 

문제는 "주파수는"나는 데이터 배열, 축 제로 따라 평평 싶은 건 이거 아니라고이다 "주파수"가되도록 한 위치에서 30 개의 값을 가져야합니다. 특정 축을 따라 ndarray를 평평하게 만드는 numpy의 함수가 있습니까?

답변

4

내 생각에 실제로 축 순서를 변경하려면 transpose이었습니다. 어떤 작업을 수행 하느냐에 따라 transposed 뒤에 .copy()을 사용하면 메모리 배치를 최적화하는 것이 유용 할 수 있습니다. 전치는 복사 자체를 생성하지 않기 때문입니다. 당신이 FC 위해 넘어 무언가를 만들고 싶어

그냥 두 번째 위치에, 당신은 끝으로 첫 번째 축을 이동하는 transposed = ndarray.transpose([1,2,0])을 사용할 수 있습니다, 마지막을 추가하고 (나는 C 순서를 transposed.ravel() 가정 않는다 그래서 0 축을 끝으로 이동). reshape을 사용하면 간단한 ravel (리턴 모양은 모든 차원이 될 수 있음)보다 더 강력합니다.

스트라이드가 정확히 합쳐지지 않으면 numpy가 배열의 사본을 만들어야하며, 많은 경우에 매우 좋은 transposed.flat() 반복자로 피할 수 있습니다.

5

np.ravel(your_array) 또는 your_array.shape=-1을 시도 할 수 있습니다. np.ravel 함수를 사용하면 선택적인 인수 order을 사용할 수 있습니다. 행 우선 순서는 C이고 열 우선 순서는 F을 선택하십시오.

0
>>> a = np.random.rand(2,2,2) 
>>> a 
array([[[ 0.67379148, 0.95508303], 
     [ 0.80520281, 0.34666202]], 

     [[ 0.01862911, 0.33851973], 
     [ 0.18464121, 0.64637853]]]) 
>>> np.ravel(a) 
array([ 0.67379148, 0.95508303, 0.80520281, 0.34666202, 0.01862911, 
     0.33851973, 0.18464121, 0.64637853])