Sök…


Introduktion

N-dimensionella matriser eller ndarrays är numpys kärnobjekt som används för att lagra objekt av samma datatyp. De ger en effektiv datastruktur som är överlägsen vanliga Pythons matriser.

Anmärkningar

Närhelst möjligt uttrycka operationer på data i terrays och vektoroperationer. Vektoroperationer utför mycket snabbare än motsvarande för slingor

Skapa en matris

Tom matris

np.empty((2,3))

Observera att i detta fall är värdena i den här arrayen inte inställda. Detta sätt att skapa en matris är därför endast användbart om matrisen fylls senare i koden.

Från en lista

np.array([0,1,2,3])
# Out: array([0, 1, 2, 3]) 

Skapa ett intervall

np.arange(4)
# Out: array([0, 1, 2, 3])

Skapa nollor

np.zeros((3,2))
# Out:
# array([[ 0.,  0.],
#        [ 0.,  0.],
#        [ 0.,  0.]])

Skapa en

np.ones((3,2))
# Out:
# array([[ 1.,  1.],
#        [ 1.,  1.],
#        [ 1.,  1.]])

Skapa linjära fördelade arrayobjekt

np.linspace(0,1,21)
# Out:
# array([ 0.  ,  0.05,  0.1 ,  0.15,  0.2 ,  0.25,  0.3 ,  0.35,  0.4 ,
#         0.45,  0.5 ,  0.55,  0.6 ,  0.65,  0.7 ,  0.75,  0.8 ,  0.85,
#         0.9 ,  0.95,  1.  ])

Skapa log-distribuerade arrayobjekt

np.logspace(-2,2,5)
# Out:
# array([  1.00000000e-02,   1.00000000e-01,   1.00000000e+00,
#          1.00000000e+01,   1.00000000e+02])

Skapa matris från en given funktion

np.fromfunction(lambda i: i**2, (5,))
# Out:
# array([  0.,   1.,   4.,   9.,  16.])
np.fromfunction(lambda i,j: i**2, (3,3))
# Out:
# array([[ 0.,  0.,  0.],
#        [ 1.,  1.,  1.],
#        [ 4.,  4.,  4.]])

Arrayoperatörer

x = np.arange(4)
x
#Out:array([0, 1, 2, 3])

skalartillskott är elementmässigt

x+10
#Out: array([10, 11, 12, 13])

skalförökning är elementvis

x*2
#Out: array([0, 2, 4, 6])

array-tillägg är elementmässigt

x+x
#Out: array([0, 2, 4, 6]) 

matrismultiplikation är elementvis

x*x
#Out: array([0, 1, 4, 9])

punktprodukt (eller mer allmänt matrismultiplikation) görs med en funktion

x.dot(x)
#Out: 14

I Python 3.5 lades @ -operatören till som en infix-operatör för matrismultiplikation

x = np.diag(np.arange(4))
print(x)
'''
   Out: array([[0, 0, 0, 0],
   [0, 1, 0, 0],
   [0, 0, 2, 0],
   [0, 0, 0, 3]])
'''
print(x@x)
print(x)
'''
   Out: array([[0, 0, 0, 0],
   [0, 1, 0, 0],
   [0, 0, 4, 0],
   [0, 0, 0, 9]])
'''

Bifoga . Returnerar kopia med bifogade värden. INTE på plats.

#np.append(array, values_to_append, axis=None)
x = np.array([0,1,2,3,4])
np.append(x, [5,6,7,8,9])
# Out: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
x
# Out: array([0, 1, 2, 3, 4])
y = np.append(x, [5,6,7,8,9])
y
# Out: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

hstack . Horisontell stack. (kolonnstapel)
vstack . Vertikal stapel. (rad stack)

# np.hstack(tup), np.vstack(tup)
x = np.array([0,0,0])
y = np.array([1,1,1])
z = np.array([2,2,2])
np.hstack(x,y,z)
# Out: array([0, 0, 0, 1, 1, 1, 2, 2, 2])
np.vstack(x,y,z)
# Out: array([[0, 0, 0],
#             [1, 1, 1],
#             [2, 2, 2]])

Array Access

Skivsyntax är i:j:k där i är startindex (inklusive), j är stoppindex (exklusivt) och k är stegstorlek. Liksom andra python-datastrukturer har det första elementet ett index på 0:

x = np.arange(10)
x[0]
# Out: 0

x[0:4]
# Out: array([0, 1, 2, 3])

x[0:4:2]
# Out:array([0, 2])

Negativa värden räknas in från slutet av matrisen. -1 därför åtkomst till det sista elementet i en matris:

x[-1]
# Out: 9
x[-1:0:-1]
# Out: array([9, 8, 7, 6, 5, 4, 3, 2, 1])

Flerdimensionella matriser kan nås genom att specificera varje dimension separerad med komma-tecken. Alla tidigare regler gäller.

x = np.arange(16).reshape((4,4))
x
# Out: 
#     array([[ 0,  1,  2,  3],
#            [ 4,  5,  6,  7],
#            [ 8,  9, 10, 11],
#            [12, 13, 14, 15]])

x[1,1]
# Out: 5

x[0:3,0]
# Out: array([0, 4, 8])

x[0:3, 0:3]
# Out: 
#     array([[ 0,  1,  2],
#            [ 4,  5,  6],
#            [ 8,  9, 10]])

x[0:3:2, 0:3:2]
# Out: 
#     array([[ 0,  2],
#            [ 8, 10]])

Transponera en matris

arr = np.arange(10).reshape(2, 5)

Med hjälp av .transpose metod:

arr.transpose()
# Out:  
#      array([[0, 5],
#            [1, 6],
#            [2, 7],
#            [3, 8],
#            [4, 9]])

.T metod:

arr.T
# Out: 
#     array([[0, 5],
#            [1, 6],
#            [2, 7],
#            [3, 8],
#            [4, 9]])

Eller np.transpose :

np.transpose(arr)
# Out:
#     array([[0, 5],
#            [1, 6],
#            [2, 7],
#            [3, 8],
#            [4, 9]])

I fallet med en tvådimensionell matris motsvarar detta en standardmatristransponering (såsom visas ovan). I det n-dimensionella fallet kan du ange en permutation av matrisaxlarna. Som standard vänder detta array.shape :

a = np.arange(12).reshape((3,2,2))
a.transpose() # equivalent to a.transpose(2,1,0)
# Out:
#   array([[[ 0,  4,  8],
#           [ 2,  6, 10]],
#
#          [[ 1,  5,  9],
#           [ 3,  7, 11]]])

Men varje permutation av axelindex är möjlig:

a.transpose(2,0,1)
# Out:
#    array([[[ 0,  2],
#            [ 4,  6],
#            [ 8, 10]],
#    
#           [[ 1,  3],
#            [ 5,  7],
#            [ 9, 11]]])

a = np.arange(24).reshape((2,3,4))  # shape (2,3,4)
a.transpose(2,0,1).shape
# Out:
#    (4, 2, 3)

Booleska indexering

arr = np.arange(7)
print(arr)
# Out: array([0, 1, 2, 3, 4, 5, 6])

Jämförelse med en skalär returnerar en boolesisk matris:

arr > 4
# Out: array([False, False, False, False, False,  True,  True], dtype=bool)

Denna matris kan användas vid indexering för att bara välja siffror större än 4:

arr[arr>4]
# Out: array([5, 6])

Boolean indexering kan användas mellan olika matriser (t.ex. relaterade parallella arrayer):

# Two related arrays of same length, i.e. parallel arrays
idxs = np.arange(10)
sqrs = idxs**2

# Retrieve elements from one array using a condition on the other
my_sqrs = sqrs[idxs % 2 == 0]
print(my_sqrs)
# Out: array([0, 4, 16, 36, 64])

Omforma en matris

numpy.reshape (samma som numpy.ndarray.reshape ) returnerar en matris med samma totala storlek, men i en ny form:

print(np.arange(10).reshape((2, 5)))   
# [[0 1 2 3 4]
#  [5 6 7 8 9]]

Den returnerar en ny matris och fungerar inte på plats:

a = np.arange(12)
a.reshape((3, 4))
print(a)
# [ 0  1  2  3  4  5  6  7  8  9 10 11]

Det är dock möjligt att skriva över shape attribut en ndarray :

a = np.arange(12)
a.shape = (3, 4)
print(a)
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]

Detta beteende kan vara överraskande till en början, men ndarray s lagras i sammanhängande minnesblock, och deras shape anger bara hur denna dataström ska tolkas som ett flerdimensionellt objekt.

Upp till en axel i shape tupel kan ha ett värde på -1 . numpy kommer då att sluta sig till längden på denna axel för dig:

a = np.arange(12)
print(a.reshape((3, -1)))
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]

Eller:

a = np.arange(12)
print(a.reshape((3, 2, -1)))

# [[[ 0  1]
#   [ 2  3]]

#  [[ 4  5]
#   [ 6  7]]

#  [[ 8  9]
#   [10 11]]]

Flera ospecificerade dimensioner, t.ex. a.reshape((3, -1, -1)) är inte tillåtna och kommer att kasta en ValueError .

Broadcasting array operationer

Aritmetiska operationer utförs elementvis på Numpy-matriser. För matriser med identisk form betyder detta att operationen utförs mellan element på motsvarande index.

# Create two arrays of the same size
a = np.arange(6).reshape(2, 3)
b = np.ones(6).reshape(2, 3)

a
# array([0, 1, 2],
#       [3, 4, 5])
b
# array([1, 1, 1],
#       [1, 1, 1])

# a + b: a and b are added elementwise
a + b
# array([1, 2, 3],
#       [4, 5, 6])

Aritmetiska operationer kan också utföras på matriser av olika former med hjälp av Numpy- sändningar . I allmänhet "sänds" en grupp över den andra så att elementvisa operationer utförs på undergrupper med kongruent form.

# Create arrays of shapes (1, 5) and (13, 1) respectively
a = np.arange(5).reshape(1, 5)
a
# array([[0, 1, 2, 3, 4]])
b = np.arange(4).reshape(4, 1)
b
# array([0],
#       [1],
#       [2],
#       [3])

# When multiplying a * b, slices with the same dimensions are multiplied
# elementwise. In the case of a * b, the one and only row of a is multiplied
# with each scalar down the one and only column of b.
a*b
# array([[ 0,  0,  0,  0,  0],
#        [ 0,  1,  2,  3,  4],
#        [ 0,  2,  4,  6,  8],
#        [ 0,  3,  6,  9, 12]])

För att illustrera detta ytterligare bör du överväga multiplikationen av 2D- och 3D-matriser med kongruenta underdimensioner.

# Create arrays of shapes (2, 2, 3) and (2, 3) respectively
a = np.arange(12).reshape(2, 2, 3)
a
# array([[[ 0  1  2]
#         [ 3  4  5]]
#
#        [[ 6  7  8]
#         [ 9 10 11]]])
b = np.arange(6).reshape(2, 3)
# array([[0, 1, 2],
#        [3, 4, 5]])

# Executing a*b broadcasts b to each (2, 3) slice of a,
# multiplying elementwise.
a*b
# array([[[ 0,  1,  4],
#         [ 9, 16, 25]],
#
#        [[ 0,  7, 16],
#         [27, 40, 55]]])

# Executing b*a gives the same result, i.e. the smaller
# array is broadcast over the other.

När används array-sändningar?

Sändning sker när två matriser har kompatibla former.

Former jämförs komponentmässigt med utgångspunkt från de efterföljande. Två dimensioner är kompatibla om de antingen är desamma eller om en av dem är 1 . Om en form har högre dimension än den andra, jämförs inte de överstående komponenterna.

Några exempel på kompatibla former:

(7, 5, 3)    # compatible because dimensions are the same
(7, 5, 3)


(7, 5, 3)    # compatible because second dimension is 1  
(7, 1, 3)

(7, 5, 3, 5) # compatible because exceeding dimensions are not compared
      (3, 5)

(3, 4, 5)    # incompatible 
   (5, 5) 

(3, 4, 5)    # compatible 
   (1, 5) 

Här är den officiella dokumentationen om array-sändningar .

Populera en matris med innehållet i en CSV-fil

filePath = "file.csv"
data = np.genfromtxt(filePath)

Många alternativ stöds, se officiell dokumentation för fullständig lista:

data = np.genfromtxt(filePath, dtype='float', delimiter=';', skip_header=1, usecols=(0,1,3) )

Numpy n-dimensionell matris: ndarray

Kärndatastrukturen i numpy är ndarray (kort för n- dimensionell matris). ndarray s är

  • homogena (dvs. de innehåller artiklar av samma datatyp)
  • innehåller objekt med fasta storlekar (ges av en form , en tupel av n positiva heltal som anger storleken för varje dimension)

Endimensionell matris:

x = np.arange(15)
# array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
x.shape
# (15,)

Två-dimensionell matris:

x = np.asarray([[0, 1, 2, 3, 4], [5, 6, 7, 8, 9], [10, 11, 12, 13, 14]])
x
# array([[ 0, 1, 2, 3, 4],
# [ 5, 6, 7, 8, 9],
# [10, 11, 12, 13, 14]])
x.shape
# (3, 5)

Tredimensionell:

np.arange(12).reshape([2,3,2])

För att initiera en matris utan att ange innehållet, använd:

x = np.empty([2, 2])
# array([[ 0., 0.],
# [ 0., 0.]])

Gissa datatyp och automatisk gjutning

Datatypen är inställd på att flyta som standard

x = np.empty([2, 2])
# array([[ 0., 0.],
# [ 0., 0.]])

x.dtype
# dtype('float64')

Om vissa data tillhandahålls, kommer numpy att gissa datatypen:

x = np.asarray([[1, 2], [3, 4]])
x.dtype
# dtype('int32')

Observera att numpy när du gör uppdrag försöker automatiskt kasta värden som passar ndarray datatyp

x[1, 1] = 1.5 # assign a float value
x[1, 1]
# 1 
# value has been casted to int
x[1, 1] = 'z' # value cannot be casted, resulting in a ValueError

Array-sändning

Se även sändningsmatrisoperationer .

x = np.asarray([[1, 2], [3, 4]])
# array([[1, 2],
         [3, 4]])
y = np.asarray([[5, 6]])
# array([[5, 6]])

I matrixterminologi skulle vi ha en 2x2 matris och en 1x2 radvektor. Vi kan fortfarande göra en summa

# x + y
array([[ 6, 8],
       [ 8, 10]])

Detta beror på att matrisen y är " sträckt " till:

array([[5, 6],
       [5, 6]])

för att passa formen på x .

Resurser:



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow