Question

I have three arrays: longitude(400,600),latitude(400,600),data(30,400,60); what I am trying to do is to extract value in the data array according to it's location(latitude and longitude).

Here is my code:

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

The problem is that the "frequency" is not what I want.I want the data array to be flattened along axis-zero,so that the "frequency" would be the 30 values at one location.Is there such a function in numpy to flatten ndarray along a particular axis?

Was it helpful?

Solution

I guess what you actually wanted was just transpose to change the axis order. Depending on what you do with it, it might be useful to do a .copy() after the transposed to optimize the memory layout, since transpose will not create a copy itself.

Just to add, if you want to make something that is beyond F and C order, you can use transposed = ndarray.transpose([1,2,0]) to move the first axis to the end, the last into second position and then do transposed.ravel() (I assumed C order, so moved 0 axis to the end). You can also use reshape which is more powerful then the simple ravel (return shape can be any dimension).

Note that unless the strides add up exactly, numpy will have to make a copy of the array, you can avoid that by the very nice transposed.flat() iterator in many cases.

OTHER TIPS

You can try np.ravel(your_array), or your_array.shape=-1. The np.ravel function lets you use an optional argument order: choose C for a row-major order or F for a column-major order.

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

You are essentially unfolding a high-dimensional tensor. Try tensorly.unfold(arr, mode=the_direction_you_want). For example,

import numpy as np
import tensorly as tl

a = np.zeros((3, 4, 5))

b = tl.unfold(a, mode=1)

b.shape # (4, 15)
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top