Obvezna naloga

Ideja te naloge je, da jo rešite z eno samo preprosto vrstico v numpyju. Nobenega for ali while, nobenih izpeljanih seznamov ali česa podobnega!

Pravilno napisna funkcija bo dolga eno vrstico, ki bo krajša od vrstice

def srecne_drzave(teze, vrednosti, drzave, meja):

Tore: napišite funkcijo srecne_drzave(teze, vrednosti, drzave, meja).

Gre, očitno, za to, kar vračata prvi dve funkciji iz prejšnje domače naloge.

Funkcija vrne vrne tabelo z imeni držav, ki so za svoje banane plačale manj od podane meje. Države morajo v tabeli nastopati v enakem vrstnem redu kot v podani tabeli drzave. Z drugimi besedami, tabela, ki jo vrnete, mora biti takšna kot tabela drzave, vendar le s tistimi državami, ki so plačale manj kot meja.

Pomoč: s tabelo nizov lahko delamo enake stvari, kot smo jih na predavanjih s tabelami števil - tudi tabelo držav lahko indeksiramo s tabelami indeksov, s tabelo True-jev in False-ov ipd.

Podatki iz testov

Semle skopiram podatke iz testov, da lahko spodaj poganjam primere.

import numpy as np

teze = np.array([
        1068570000, 9342850, 612897, 18700200, 49379400, 56, 370860, 43500500, 10144900, 13835200, 43631, 560529, 744,
        17534600, 244311, 1532300, 196011000, 11942800, 14537700, 126296000, 1109590000, 19241800, 351094000, 78485700,
        200695000, 38, 36990300, 1043, 44463300, 2254140, 8458220, 4928940, 34353400, 665230000, 921, 4361420000,
        6713560,
        2801620, 25146700, 1383, 232316000, 16513200, 15257100, 87426100, 1262980, 984042, 3696, 5001, 2276820, 1834080,
        3674190, 1389550, 18517700, 1405, 70, 214838000, 243406, 3811980, 209393, 663050000, 184010000, 37136, 2776060,
        1023000000, 96376, 42021600, 73296100, 10801, 652604000, 11648, 175679000, 56456100, 3244410, 432232, 28058500,
        5749150, 496208000, 189785000, 661390000, 306924000, 3990210, 2201580, 252888000, 721, 14383800, 24717400, 80,
        1035, 77105800, 5007, 20, 6560710, 15098200, 1260, 1308900000, 4985, 16187800, 81313800, 207859000, 12153300,
        27587000, 10744700, 620922, 120931000, 4078, 98410700, 40, 511178, 79888700, 10536100, 337907000, 623329, 54,
        21303300, 2243, 6242780, 53954900, 39347600, 58980300, 954379, 45073400, 221254000, 11955600, 8986530, 201142,
        152588000, 67857700, 2779200, 39630100, 4220, 72308600, 91093500, 505, 423, 682, 111907000, 8342420, 55854900,
        1000, 7133440, 192466, 623, 41875700, 20, 564718000, 7, 49, 36951000, 97095, 67025]
    )
vrednosti = np.array([
        704414240.0, 5198640.0, 157250.0, 5112190.0, 36917880.0, 630.0, 8000.0, 15652370.0, 5257200.0, 9220620.0,
        92800.0,
        448430.0, 4370.0, 12969130.0, 49730.0, 382490.0, 132893720.0, 11756100.0, 4162040.0, 128338700.0, 850738690.0,
        19999940.0, 114364670.0, 82133940.0, 95349460.0, 290.0, 8672850.0, 1770.0, 34411500.0, 235290.0, 11840420.0,
        8420020.0, 30988300.0, 246818670.0, 6020.0, 2121188560.0, 1053330.0, 89600.0, 2210900.0, 1390.0, 89375730.0,
        8342040.000000001, 14250450.0, 86454840.0, 1010400.0, 5040470.0, 2960.0, 34260.0, 1324970.0, 1448430.0,
        1362790.0,
        769760.0, 1500810.0, 310.0, 290.0, 154979800.0, 319310.0, 212700.0, 317670.0, 497390830.0, 180013280.0, 17550.0,
        1794780.0, 762868730.0, 42760.0, 32244710.0, 34409890.0, 8550.0, 704455360.0, 52000.0, 47054850.0, 70982550.0,
        306660.0, 75920.0, 12041100.0, 5823920.0, 354618660.0, 131940180.0, 392402000.0, 176103690.0,
        4178640.0000000005,
        331280.0, 202587630.0, 3080.0, 11359250.0, 910640.0, 190.0, 830.0, 67082000.0, 21350.0, 340.0, 3809010.0,
        14232640.0, 1920.0, 946332640.0, 24940.0, 11224320.0, 61946980.0, 105558710.0, 339780.0, 16204030.0, 5069310.0,
        55400.0, 100032790.0, 3260.0, 47176630.0, 120.0, 163550.0, 101210240.0, 5584560.0, 210354680.0, 405000.0, 10.0,
        3255560.0, 4140.0, 7085300.0, 36155240.0, 17821430.0, 54699790.0, 744540.0, 24541610.0, 186693450.0, 1974190.0,
        5114640.0, 158850.0, 102653740.0, 47623360.0, 1565850.0, 25061160.0, 3550.0, 57945390.0, 57052640.0, 400.0,
        470.0,
        12040.0, 16552220.000000002, 367340.0, 4715430.0, 160.0, 7980060.0, 803750.0, 1060.0, 30607910.0, 20.0,
        427873090.0, 130.0, 240.0, 22456700.0, 111600.0, 32400.0]
    )
drzave = np.array([
        'Russian Federation', 'Botswana', 'Paraguay', 'Tunisia', 'Croatia', 'Cook Islands', 'Benin', 'Uruguay',
        'Egypt, Arab Rep.', 'Bahrain', 'Greenland', 'Vietnam', 'French Polynesia', 'Albania', 'Lebanon', 'Malaysia',
        'Czech Republic', 'Estonia', 'Trinidad and Tobago', 'Austria', 'Japan', 'Azerbaijan', 'Argentina', 'Norway',
        'Turkey', 'Vanuatu', 'South Africa', 'Malawi', 'Belarus', 'Mauritania', 'Armenia', 'Luxembourg', 'Lithuania',
        'China', 'New Caledonia', 'United States', 'Nigeria', 'Burkina Faso', 'Colombia', 'Fiji',
        'Syrian Arab Republic',
        'Senegal', 'Georgia', 'Denmark', 'Bermuda', 'Bahamas, The', 'Dominican Republic', 'Venezuela', 'Macao',
        'Brunei',
        'Barbados', 'Maldives', 'Mali', 'Pakistan', "Cote d'Ivoire", 'Ukraine', 'Andorra', 'Niger', 'Mexico', 'Italy',
        'Sweden', 'St. Kitts and Nevis', 'Aruba', 'United Kingdom', 'Kenya', 'Bulgaria', 'Hong Kong, China', 'Panama',
        'Belgium', 'Israel', 'Chile', 'Finland', 'Rwanda', 'Bhutan', 'Morocco', 'Iceland', 'Canada', 'Spain',
        'Iran, Islamic Rep.', 'Saudi Arabia', 'Namibia', 'Guatemala', 'Poland', 'Ethiopia(excludes Eritrea)',
        'Occ.Pal.Terr', 'Costa Rica', 'Comoros', 'Lao PDR', 'Hungary', 'Ghana', 'Gambia, The', 'Montenegro', 'Latvia',
        'Bangladesh', 'Germany', 'Brazil', 'North Macedonia', 'New Zealand', 'Algeria', 'Nepal', 'Qatar', 'Oman',
        'Uganda', 'Greece', 'Mozambique', 'Libya', 'Guyana', 'Zimbabwe', 'Switzerland', 'Moldova', 'Korea, Rep.',
        'Antigua and Barbuda', 'Bolivia', 'Afghanistan', 'Gabon', 'Malta', 'Slovenia', 'Singapore', 'Slovak Republic',
        'Lesotho', 'Kazakhstan', 'Netherlands', 'Thailand', 'Kyrgyz Republic', 'Zambia', 'Portugal', 'Romania',
        'Indonesia', 'Jordan', 'Angola', 'Ireland', 'Kuwait', 'Micronesia, Fed. Sts.', 'St. Lucia', 'Seychelles',
        'El Salvador', 'Nicaragua', 'Honduras', 'Burundi', 'Cyprus', 'Australia', 'Cape Verde',
        'Serbia, FR(Serbia/Montenegro)', 'Palau', 'France', 'Other Asia, nes', 'Tonga', 'Bosnia and Herzegovina',
        'Grenada', 'Sri Lanka']
    )

Rešitev

Cene banan dobimo tako, da delimo vrednosti s težami.

vrednosti / teze
array([ 0.65921207,  0.55642978,  0.2565684 ,  0.27337622,  0.74763727,
       11.25      ,  0.02157148,  0.35982046,  0.51821112,  0.66646091,
        2.1269281 ,  0.80001213,  5.87365591,  0.73963079,  0.20355203,
        0.24961822,  0.67799113,  0.98436715,  0.28629288,  1.01617391,
        0.76671445,  1.03940068,  0.32573804,  1.04648286,  0.47509634,
        7.63157895,  0.23446282,  1.6970278 ,  0.77393041,  0.10438127,
        1.39987137,  1.70828211,  0.90204463,  0.37102757,  6.53637351,
        0.48635274,  0.15689589,  0.0319815 ,  0.08792008,  1.00506146,
        0.38471621,  0.50517404,  0.93402088,  0.9888905 ,  0.80001267,
        5.12221023,  0.8008658 ,  6.85062987,  0.58193884,  0.78973109,
        0.37090896,  0.55396351,  0.08104732,  0.22064057,  4.14285714,
        0.72137983,  1.31184112,  0.05579777,  1.51709943,  0.75015584,
        0.97827988,  0.47258725,  0.64652061,  0.74571723,  0.44367892,
        0.76733656,  0.46946413,  0.79159337,  1.07945302,  4.46428571,
        0.26784562,  1.25730523,  0.0945195 ,  0.17564641,  0.42914268,
        1.0130054 ,  0.71465728,  0.69520868,  0.59329896,  0.5737697 ,
        1.04722308,  0.15047375,  0.80109626,  4.27184466,  0.78972525,
        0.03684206,  2.375     ,  0.80193237,  0.8699994 ,  4.26403036,
       17.        ,  0.58057893,  0.94267131,  1.52380952,  0.72299843,
        5.00300903,  0.69338144,  0.76182616,  0.50783805,  0.02795784,
        0.5873792 ,  0.47179633,  0.08922216,  0.82718898,  0.79941148,
        0.47938517,  3.        ,  0.31994726,  1.26689056,  0.53004053,
        0.62252241,  0.64973714,  0.18518519,  0.15281952,  1.84574231,
        1.1349591 ,  0.67010114,  0.45292292,  0.92742475,  0.78013033,
        0.544481  ,  0.84379695,  0.1651268 ,  0.56914515,  0.78974058,
        0.67275107,  0.70181217,  0.56341753,  0.63237691,  0.84123223,
        0.80136236,  0.62630857,  0.79207921,  1.11111111, 17.65395894,
        0.1479105 ,  0.04403279,  0.08442285,  0.16      ,  1.11868327,
        4.17606227,  1.70144462,  0.73092295,  1.        ,  0.75767567,
       18.57142857,  4.89795918,  0.60774269,  1.14938977,  0.48340172])

Zanimajo nas elementi, ki so manjši od določene meje. Naj bo

meja = 0.4

Potem imamo

vrednosti / teze < meja
array([False, False,  True,  True, False, False,  True,  True, False,
       False, False, False, False, False,  True,  True, False, False,
        True, False, False, False,  True, False, False, False,  True,
       False, False,  True, False, False, False,  True, False, False,
        True,  True,  True, False,  True, False, False, False, False,
       False, False, False, False, False,  True, False,  True,  True,
       False, False, False,  True, False, False, False, False, False,
       False, False, False, False, False, False, False,  True, False,
        True,  True, False, False, False, False, False, False, False,
        True, False, False, False,  True, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
        True, False, False,  True, False, False, False, False,  True,
       False, False, False, False,  True,  True, False, False, False,
       False, False, False, False, False,  True, False, False, False,
       False, False, False, False, False, False, False, False, False,
        True,  True,  True,  True, False, False, False, False, False,
       False, False, False, False, False, False])

Če želimo iz seznama držav dobiti tiste, pri katerih je v tem seznamu True, napišemo

drzave[vrednosti / teze < meja]
array(['Paraguay', 'Tunisia', 'Benin', 'Uruguay', 'Lebanon', 'Malaysia',
       'Trinidad and Tobago', 'Argentina', 'South Africa', 'Mauritania',
       'China', 'Nigeria', 'Burkina Faso', 'Colombia',
       'Syrian Arab Republic', 'Barbados', 'Mali', 'Pakistan', 'Niger',
       'Chile', 'Rwanda', 'Bhutan', 'Guatemala', 'Costa Rica', 'Nepal',
       'Uganda', 'Zimbabwe', 'Bolivia', 'Afghanistan', 'Thailand',
       'El Salvador', 'Nicaragua', 'Honduras', 'Burundi'], dtype='<U29')

Naša funkcija je potemtakem:

def srecne_drzave(teze, vrednosti, drzave, meja):
    return drzave[vrednosti / teze < meja]

Dodatna naloga

Ta je tako, za zraven. Neobvezno.

Dam vam funkcijo

def indeks_drzave(drzave, drzava):
    return np.where(drzave == drzava)[0][0]

ki vrne indeks države v tabeli držav.

Napišite funkcijo vec_kot(teze, drzave, drzava), ki prejme tabelo s težami, tabelo z državami in ime neke države. Vrne število držav, ki so kupile več banan kot podana država.

Rešitev

indeks_drzave potrebujemo samo zato, da izvemo, koliko banan je kupila ta država.

drzava = "Slovenia"
indeks_drzave(drzave, "Slovenia")
np.int64(116)
teze[indeks_drzave(drzave, "Slovenia")]
np.int64(53954900)

Ko vemo, koliko kilogramov banan je kupila Slovenija, lahko sestavimo tabelo, ki bo vsebovala True za vse teže, ki so večje od te.

teze > teze[indeks_drzave(drzave, "Slovenia")]
array([ True, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False,  True, False,
       False,  True,  True, False,  True,  True,  True, False, False,
       False, False, False, False, False, False,  True, False,  True,
       False, False, False, False,  True, False, False,  True, False,
       False, False, False, False, False, False, False, False, False,
       False,  True, False, False, False,  True,  True, False, False,
        True, False, False,  True, False,  True, False,  True,  True,
       False, False, False, False,  True,  True,  True,  True, False,
       False,  True, False, False, False, False, False,  True, False,
       False, False, False, False,  True, False, False,  True,  True,
       False, False, False, False,  True, False,  True, False, False,
        True, False,  True, False, False, False, False, False, False,
       False,  True, False, False,  True, False, False, False,  True,
        True, False, False, False,  True,  True, False, False, False,
        True, False,  True, False, False, False, False, False, False,
        True, False, False, False, False, False])

Da ugotovimo, koliko je True-jev, seštejemo elemente te tabele.

sum(teze > teze[indeks_drzave(drzave, "Slovenia")])
np.int64(41)

In funkcija je:

def vec_kot(teze, drzave, drzava):
    return sum(teze > teze[indeks_drzave(drzave, drzava)])