Suche…


Einführung

N-dimensionalen Arrays oder ndarrays sind numpy Kernobjekt verwendet für Elemente desselben Datentyps speichert. Sie bieten eine effiziente Datenstruktur, die herkömmlichen Arrays von Python überlegen ist.

Bemerkungen

Wann immer möglich, Operationen mit Daten in Form von Arrays und Vektoroperationen ausdrücken. Vektoroperationen werden für Schleifen viel schneller als die entsprechenden ausgeführt

Erstellen Sie ein Array

Leeres Array

np.empty((2,3))

Beachten Sie, dass in diesem Fall die Werte in diesem Array nicht festgelegt werden. Diese Art der Array-Erstellung ist daher nur sinnvoll, wenn das Array später im Code gefüllt wird.

Aus einer Liste

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

Erstellen Sie einen Bereich

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

Erstellen Sie Nullen

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

Erstellen Sie eine

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

Erstellen Sie linienförmige Array-Elemente

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

Erstellen Sie Array-Elemente mit Protokollabstand

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

Erstellen Sie ein Array aus einer bestimmten 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.]])

Array-Operatoren

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

Skalaraddition ist elementweise

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

Skalarmultiplikation ist elementweise

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

Array-Addition ist elementweise

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

Array-Multiplikation ist elementweise

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

Punktprodukt (oder allgemeiner Matrixmultiplikation) erfolgt mit einer Funktion

x.dot(x)
#Out: 14

In Python 3.5 wurde der Operator @ als Infix-Operator für die Matrixmultiplikation hinzugefügt

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

Anhängen Gibt eine Kopie mit angehängten Werten zurück. Nicht an Ort und Stelle.

#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 Horizontaler Stapel (Spaltenstapel)
Vstack Vertikaler Stapel. (Reihenstapel)

# 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-Zugriff

Die Slice-Syntax lautet i:j:k wobei i der Startindex (einschließlich) ist, j der Stoppindex (exklusiv) und k die Schrittgröße ist. Wie andere Python-Datenstrukturen hat das erste Element den Index 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])

Negative Werte zählen vom Ende des Arrays. -1 greift daher auf das letzte Element in einem Array zu:

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

Auf mehrdimensionale Arrays kann zugegriffen werden, indem jede durch Kommas getrennte Dimension angegeben wird. Alle vorherigen Regeln gelten.

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

Transponieren eines Arrays

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

.transpose Methode verwenden:

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

.T Methode:

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

Oder np.transpose :

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

Im Falle eines 2-dimensionalen Arrays entspricht dies einer Standardmatrixtransponierung (wie oben dargestellt). Im n-dimensionalen Fall können Sie eine Permutation der Array-Achsen angeben. Standardmäßig werden array.shape umgekehrt:

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

Es ist jedoch jede Permutation der Achsindizes möglich:

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)

Boolesche Indizierung

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

Ein Vergleich mit einem Skalar gibt ein boolesches Array zurück:

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

Dieses Array kann bei der Indizierung verwendet werden, um nur die Zahlen größer als 4 auszuwählen:

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

Die boolesche Indizierung kann zwischen verschiedenen Arrays (z. B. verwandten parallelen Arrays) verwendet werden:

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

Umformen eines Arrays

Die Methode numpy.reshape (identisch mit numpy.ndarray.reshape ) gibt ein Array derselben Gesamtgröße zurück, aber in einer neuen Form:

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

Es gibt ein neues Array zurück und funktioniert nicht an Ort und Stelle:

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

Es ist jedoch möglich, das shape Attribut eines ndarray zu überschreiben:

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

Dieses Verhalten mag zunächst überraschend sein, aber ndarray werden in zusammenhängenden Speicherblöcken gespeichert und ihre shape nur an, wie dieser Datenstrom als mehrdimensionales Objekt interpretiert werden soll.

Bis zu einer Achse in der shape Tupel kann einen Wert von -1 . numpy dann die Länge dieser Achse für Sie:

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

Oder:

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

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

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

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

Mehrere nicht angegebene Dimensionen, z. B. a.reshape((3, -1, -1)) sind nicht zulässig und werfen einen ValueError .

Broadcasting-Array-Operationen

Arithmetische Operationen werden elementweise auf Numpy-Arrays durchgeführt. Für Arrays mit identischer Form bedeutet dies, dass die Operation zwischen Elementen in entsprechenden Indizes ausgeführt wird.

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

Arithmetische Operationen können auch auf Arrays verschiedener Formen mittels unkomplizierter Übertragung ausgeführt werden . Im Allgemeinen wird ein Array über das andere "Broadcast", so dass elementweise Operationen an Teilarrays mit kongruenter Form ausgeführt werden.

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

Um dies weiter zu veranschaulichen, betrachten Sie die Multiplikation von 2D- und 3D-Arrays mit kongruenten Unterdimensionen.

# 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.

Wann wird Array Broadcasting angewendet?

Die Übertragung findet statt, wenn zwei Arrays kompatible Formen haben.

Formen werden komponentenweise ausgehend von den nachgestellten verglichen. Zwei Dimensionen sind kompatibel, wenn sie gleich sind oder eine davon 1 . Wenn eine Form eine höhere Dimension als die andere hat, werden die übersteigenden Komponenten nicht verglichen.

Einige Beispiele kompatibler Formen:

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

Hier ist die offizielle Dokumentation zum Array-Broadcasting .

Füllen Sie ein Array mit dem Inhalt einer CSV-Datei

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

Viele Optionen werden unterstützt. Die vollständige Liste finden Sie in der offiziellen Dokumentation :

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

Numpy n-dimensionales Array: das Narray

Die Kerndatenstruktur in numpy ist das ndarray (kurz für n- dimensionales Array). ndarray s sind

  • homogen (dh sie enthalten Elemente des gleichen Datentyps)
  • enthalten Elemente fester Größen (gegeben durch eine Form , ein Tupel von n positiven ganzen Zahlen, die die Größe jeder Dimension angeben)

Eindimensionale Anordnung:

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

Zweidimensionale Anordnung:

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)

Dreidimensional:

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

So initialisieren Sie ein Array ohne Angabe des Inhalts use:

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

Datentyptypen und automatisches Casting

Der Datentyp ist standardmäßig auf Float gesetzt

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

x.dtype
# dtype('float64')

Wenn einige Daten bereitgestellt werden, wird der Datentyp von numpy erraten:

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

Beachten Sie, dass numpy bei Zuweisungen versucht, die Werte automatisch an den Datentyp des ndarray

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-Übertragung

Siehe auch Broadcasting-Array-Operationen .

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

In der Matrixterminologie hätten wir eine 2x2-Matrix und einen 1x2-Zeilenvektor. Trotzdem können wir eine Summe machen

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

Dies liegt daran, dass das Array y " gestreckt " ist:

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

an die Form von x .

Ressourcen:



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow