Bottom Page

Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
 Numpy structured array
#1
Hi all,

I am fairly new to Python and teaching myself. I am working on importing data from a txt file into a NumPy structured array. I have loaded the data in to give three fields: the IATA code of an airport, the airport's latitude, and it's longitude...

 import numpy as np

fname = 'busiest_airports.txt'

dtype1 = np.dtype([('IATA', '|S4'), ('latitude', 'f8'),
                   ('longitude', 'f8')])

a = np.loadtxt(fname, dtype = dtype1, usecols = (0, -2, -1))

print(a) 

This gives me the following array...

 
array([(b'FRA',  50.026,    8.543), (b'DEN',  39.862, -104.673),
       (b'BKK',  13.681,  100.747), (b'SYD', -33.946,  151.177),
       (b'GRU', -23.432,  -46.47 ), (b'CLT',  35.214,  -80.943),
       (b'SFO',  37.619, -122.375), (b'IAH',  29.984,  -95.341),
       (b'ATL',  33.637,  -84.428), (b'ICN',  37.469,  126.451),
       (b'DFW',  32.897,  -97.038), (b'HND',  35.552,  139.78 ),
       (b'LAS',  36.08 , -115.152), (b'PHX',  33.434, -112.012),
       (b'PVG',  31.143,  121.805), (b'DXB',  25.253,   55.364),
       (b'MIA',  25.793,  -80.291), (b'IST',  40.977,   28.815),
       (b'AMS',  52.309,    4.764), (b'CAN',  23.392,  113.299),
       (b'LAX',  33.943, -118.408), (b'CGK',  -6.126,  106.656),
       (b'LHR',  51.477,   -0.461), (b'JFK',  40.64 ,  -73.779),
       (b'SIN',   1.35 ,  103.994), (b'CDG',  49.013,    2.55 ),
       (b'HKG',  22.309,  113.915), (b'ORD',  41.979,  -87.905),
       (b'KUL',   2.746,  101.71 ), (b'PEK',  40.08 ,  116.585)],
      dtype=[('IATA', 'S4'), ('latitude', '<f8'), ('longitude', '<f8')]) 
Now I want to write a function so that I can call the IATA code of an airport and have it's latitude returned. I have tried
 
 def get_lat(x):
    x = a['IATA'][i]
    latitude = a['latitude'][i]
    return latitude 
The idea was to try to set the index 'i' depending on which IATA code is input as the argument of the function. For example an argument of 'BKK' would set i = 1. However I get the error message that 'i' is not defined. Does anyone know how to correctly define the function? Thanks in advance
Quote
#2
You are not structuring the array as you think.
You are creating an array that is 30x1. Verify this by
print(a.shape())
Each element in the array is an object, since numpy arrays can only hold one "type".
If you
print(a[0], type(a[0]))
you will get (b'FRA', 50.026, 8.543) and numpy.void as the type.

Pandas, on the other hand, supports arrays that have multiple types and should handle this problem better.
Quote
#3
Thanks for the reply. I probably should have mentioned that this is an exercise from a textbook I am studying that has instructions to complete the task specifically using structured arrays. Can you think of any way of doing it without Pandas?
Quote
#4
OK. Not as a function but this does the trick, modify as needed at accept an argument and as a function and you've got it.
import numpy as np

a = np.array([(b'FRA',  50.026,    8.543), (b'DEN',  39.862, -104.673),
       (b'BKK',  13.681,  100.747), (b'SYD', -33.946,  151.177),
       (b'GRU', -23.432,  -46.47 ), (b'CLT',  35.214,  -80.943),
       (b'SFO',  37.619, -122.375), (b'IAH',  29.984,  -95.341),
       (b'ATL',  33.637,  -84.428), (b'ICN',  37.469,  126.451),
       (b'DFW',  32.897,  -97.038), (b'HND',  35.552,  139.78 ),
       (b'LAS',  36.08 , -115.152), (b'PHX',  33.434, -112.012),
       (b'PVG',  31.143,  121.805), (b'DXB',  25.253,   55.364),
       (b'MIA',  25.793,  -80.291), (b'IST',  40.977,   28.815),
       (b'AMS',  52.309,    4.764), (b'CAN',  23.392,  113.299),
       (b'LAX',  33.943, -118.408), (b'CGK',  -6.126,  106.656),
       (b'LHR',  51.477,   -0.461), (b'JFK',  40.64 ,  -73.779),
       (b'SIN',   1.35 ,  103.994), (b'CDG',  49.013,    2.55 ),
       (b'HKG',  22.309,  113.915), (b'ORD',  41.979,  -87.905),
       (b'KUL',   2.746,  101.71 ), (b'PEK',  40.08 ,  116.585)],dtype=[('IATA', 'S4'), ('latitude', '<f8'), ('longitude', '<f8')])

for obj in a:
    better_list = list(obj)
    if better_list[0] == b'BKK' :
        print(f"Foo = {better_list[1]}")
Quote

Top Page

Possibly Related Threads...
Thread Author Replies Views Last Post
  memory issue loading movie to numpy array djf123 1 51 Nov-07-2019, 06:19 AM
Last Post: ThomasL
  numpy.copy / numpy.delete paul18fr 3 271 Jul-26-2019, 01:51 PM
Last Post: paul18fr
  AttributeError: module 'numpy' has no attribute 'array aapurdel 7 4,238 May-29-2019, 02:48 AM
Last Post: heiner55
  Array in numpy Truman 5 4,121 May-26-2019, 10:14 AM
Last Post: snippsat
  [split] Array in numpy aapurdel 1 284 May-25-2019, 08:05 PM
Last Post: buran
  [numpy]add a value to an array elmismo999 1 370 May-23-2019, 04:15 PM
Last Post: michalmonday
  "erlarge" a numpy-matrix to numpy-array PhysChem 2 409 Apr-09-2019, 04:54 PM
Last Post: PhysChem
  while creating a array using numpy.arrange, how to negate only the last 50 numbers? vicky53 1 409 Apr-06-2019, 11:52 AM
Last Post: scidam
  How to get the size of a numpy array? mcgrim 2 460 Mar-23-2019, 02:25 PM
Last Post: perfringo
  creating an empty NumPy array in Python sandeepatel 2 1,089 Jan-16-2019, 09:24 AM
Last Post: rinu

Forum Jump:


Users browsing this thread: 1 Guest(s)