Afsnit Py.3: Indlæsning, dataframe og matriks

Jeg vil beskrive to forskellige indlæsningssituationer. I den første situation skal vi blot indlæse en følge af tal uden nogen speciel struktur. Enten er alle tallene på første linje adskildt af et eller flere mellemrum, eller også er der et enkelt tal på hver linje. I denne situation bruger man loadtxt fra numpy:
np.loadtxt("filnavn")
hvilket giver en vektor med tallene.
I den anden datasituation er data organiseret i søjler, typisk med søjleoverskrifter, og data i en række er adskildt af komma (typisk vil datafilen have endelsen "csv"). Data indlæses med kommandoen readcsv fra pandas:
pd.readcsv("filnavn")
Hvis der ikke er søjleoverskrifter i datafilen, skal man tilføje header=None til kaldet. Hvis første søjle indeholder rækkenavne, skal man tilføje indexcol=0 til kaldet. Hvis det indlæste er placeret i mydata, er dette en pandas dataframe. Man kan tænke på dette som en liste af søjler (variable), alle med samme længde. Man kan få adgang til en søjle ved hjælp af dennes navn. Hvis for eksempel der er en søjle med navnet Soejle1, får man denne med kommandoen
mydata.Soejle1 eller mydata['Soejle1']
Resultatet fra denne kommando har struktur af en søjle i en datatabel (formelt er det en pandas series). Hvis man vil have en vektor med værdierne i søjlen, kan man skrive
mydata.Soejle1.values
Det første element i søjlen kan man få med kommandoen mydata.Soejle1[0]. Alternativt, hvis Soejle1 er den første søjle, kan man også bruge en matriksindeksering: mydata.iloc[0,0].
I kodedelen nedenfor indlæses data fra en fil Ind.csv med indholdet
Efter indlæsningen deles Alder op i to datasæt alt efter køn. Når data udskrives efter indlæsningen, vil python indsætte et rækkenummer ud for hver række.

import pandas as pd

dat=pd.read_csv("Ind.csv")
print(dat)
|    Koen Alder
| 0  Pige     7
| 1  Pige     2
| 2 Dreng     5
| 3 Dreng     7
| 4 Dreng     3

print(dat.Alder[dat.Koen=="Pige"])
| 0    7
| 1    2
| Name: Alder, dtype: int64

print(dat.Alder[dat.Koen=="Dreng"])
| 2    5
| 3    7
| 4    3
| Name: Alder, dtype: int64

print(dat.Alder.values[dat.Koen=="Dreng"])
| [5 7 3]

Man kan selv lave datatabeller inde i python. Dette er omtalt i afsnit 6.6.

Py.3.1 Matricer

Ligesom data kan organiseres i vektorer i python via np.array (efter import numpy as np), kan data også organiseres i matricer, det vil sige en struktur med et antal rækker og et antal søjler. En matrix kan dannes ved at angive de enkelte rækker, for eksempel en matrix:
np.array([[x11,x12,x13],[x21,x22,x23]])
Ved at benytte reshape kan den samme matrix også laves med kommandoen
array([x11,x12,x13,x21,x22,x23]).reshape((2,3))

import numpy as np

aMat=np.array([1,2,3,4,5,6,7,8,9,10,11,12]).reshape((3,4))
print(aMat)
| [[ 1  2  3  4]
|  [ 5  6  7  8]
|  [ 9 10 11 12]]

print(aMat.T) # aMat transponeret
| [[ 1  5  9]
|  [ 2  6 10]
|  [ 3  7 11]
|  [ 4  8 12]]

print(aMat[2,3])  # indgang (3,4) (index starter i nul!)
| 12 

print(aMat[2,:])  # række 3 som en vektor
| [ 9 10 11 12]

print(aMat[:,2])  # søjle 3 som en vektor
| [ 3  7 11]

print(aMat[:,2].shape) # den 3. søjle er en søjlevektor
| (3,)

print(aMat.reshape(-1)) # alle indgangene læst rækkevis
| [ 1  2  3  4  5  6  7  8  9 10 11 12]

print(np.max(aMat))  # maximum over alle indgange
| 12

print(np.mean(aMat))  # gennemsnit over alle indgange
| 6.5

print(aMat.sum(0)) # søjlesummer
| [15 18 21 24]

print(aMat.sum(1)) # rækkesummer
| [10 26 42]

print(aMat.max(0)) # maximum i hver søjle
| [ 9 10 11 12]

Matrix multiplikation af to matricer og beregnes med matmul(A,B), og den inverse af en kvadratisk matrix fås med linalg.inv(A).

import numpy as np

aMat=np.array([[1,2],[3,4]])
bMat=np.array([[1,2,3],[4,5,6]])

print(np.matmul(aMat,bMat))
| [[ 9 12 15]
|  [19 26 33]]

print(np.linalg.inv(aMat))
| [[-2.   1. ]
|  [ 1.5 -0.5]]

print(np.matmul(aMat,np.linalg.inv(aMat)))
| [[1.0000000e+00 0.0000000e+00]
|  [8.8817842e-16 1.0000000e+00]]

v=np.array([1,2])  # dette er en vektor
print(np.matmul(v,aMat))
| [ 7 10]

print(np.matmul(aMat,v)) # numpy opfatter også v som en søjle
| [ 5 11]

w=v.reshape((1,2)) # w defineres som en matrix med en enkelt række

print(np.matmul(aMat,w))
| ValueError: ...

ForegåendeNæste