2012-09-24 96 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)) 

的問題是,「頻率」是不是我想要want.I沿軸零變平的數據陣列,是什麼使「頻率」將是在一個位置的30個值。是否有這樣一個函數,用於沿着特定軸平坦化ndarray?

回答

4

我想你實際想要的只是transpose來改變軸的順序。根據您的處理方式,在transposed之後執行.copy()以優化內存佈局可能會很有用,因爲轉置本身不會創建副本。

我想補充,如果你想的東西是超越FC順序,可以使用transposed = ndarray.transpose([1,2,0])到第一軸移動到結束,最後到第二的位置,然後就transposed.ravel()(我假定Ç順序,所以將0軸移動到最後)。你也可以使用reshape這是更強大,然後簡單ravel(返回形狀可以是任何尺寸)。

請注意,除非大步精確地加起來,否則numpy將不得不復制數組,您可以在很多情況下通過非常好的transposed.flat()迭代器來避免這種情況。

5

您可以嘗試np.ravel(your_array)your_array.shape=-1np.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])