Szukaj…


Wprowadzenie

Tablice N-wymiarowe lub ndarrays są podstawowym obiektem numpy używanym do przechowywania elementów tego samego typu danych. Zapewniają wydajną strukturę danych, która przewyższa zwykłe tablice Pythona.

Uwagi

O ile to możliwe, należy wyrazić operacje na danych w postaci tablic i operacji wektorowych. Operacje wektorowe wykonują się znacznie szybciej niż w przypadku pętli

Utwórz tablicę

Pusta tablica

np.empty((2,3))

Zauważ, że w tym przypadku wartości w tej tablicy nie są ustawione. Ten sposób tworzenia tablicy jest zatem użyteczny tylko wtedy, gdy tablica jest wypełniana później w kodzie.

Z listy

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

Utwórz zakres

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

Utwórz Zera

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

Stwórz

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

Utwórz elementy tablicy z odstępami liniowymi

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

Utwórz elementy tablicy z odstępami w logach

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

Utwórz tablicę z danej funkcji

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

Operatory macierzy

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

dodawanie skalarne jest mądre

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

mnożenie skalarne jest mądre

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

dodawanie tablic jest zależne od elementu

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

mnożenie tablic jest oparte na elementach

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

iloczyn iloczynu (lub bardziej ogólnie mnożenie macierzy) odbywa się za pomocą funkcji

x.dot(x)
#Out: 14

W Pythonie 3.5 operator @ został dodany jako operator infix do mnożenia macierzy

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

Dołącz Zwraca kopię z dołączonymi wartościami. Nie na miejscu.

#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 . Poziomy stos. (stos kolumn)
vstack . Pionowy stos. (stos rzędów)

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

Dostęp do macierzy

Składnia plastra to i:j:k gdzie i jest indeksem początkowym (włącznie), j jest indeksem zatrzymania (wyłącznym), a k jest wielkością kroku. Podobnie jak inne struktury danych w Pythonie, pierwszy element ma indeks 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])

Wartości ujemne liczą się od końca tablicy. -1 uzyskuje zatem dostęp do ostatniego elementu w tablicy:

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

Dostęp do tablic wielowymiarowych można uzyskać, określając każdy wymiar oddzielony przecinkami. Obowiązują wszystkie poprzednie zasady.

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

Transponowanie tablicy

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

Za .transpose metody .transpose :

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

Metoda .T :

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

Lub np.transpose :

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

W przypadku macierzy dwuwymiarowej odpowiada to standardowej transpozycji macierzy (jak pokazano powyżej). W przypadku n-wymiarowym możesz określić permutację osi macierzy. Domyślnie odwraca to 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]]])

Ale możliwa jest dowolna permutacja wskaźników osi:

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)

Indeksowanie boolowskie

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

Porównanie ze skalarem zwraca tablicę boolowską:

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

Tej tablicy można użyć podczas indeksowania, aby wybrać tylko liczby większe niż 4:

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

Indeksowanie logiczne można stosować między różnymi tablicami (np. Powiązane tablice równoległe):

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

Przekształcanie tablicy

Metoda numpy.reshape (taka sama jak metoda numpy.ndarray.reshape ) zwraca tablicę o tym samym rozmiarze całkowitym, ale w nowym kształcie:

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

Zwraca nową tablicę i nie działa w miejscu:

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

Możliwe jest jednak zastąpienie atrybutu shape ndarray :

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

To zachowanie może początkowo być zaskakujące, ale ndarray są przechowywane w ciągłych blokach pamięci, a ich shape określa jedynie, w jaki sposób ten strumień danych powinien być interpretowany jako obiekt wielowymiarowy.

Maksymalnie jedna oś w krotce shape może mieć wartość -1 . numpy dla ciebie długość tej osi:

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

Lub:

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

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

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

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

Wiele nieokreślonych wymiarów, np. a.reshape((3, -1, -1)) jest niedozwolonych i spowoduje ValueError .

Operacje tablic rozgłoszeniowych

Operacje arytmetyczne wykonywane są elementarnie na tablicach Numpy. W przypadku tablic o identycznym kształcie oznacza to, że operacja jest wykonywana między elementami o odpowiednich indeksach.

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

Operacje arytmetyczne można również wykonywać na tablicach o różnych kształtach za pomocą nadawania Numpy. Zasadniczo jedna tablica jest „rozgłaszana” nad drugą, tak że elementarne operacje są wykonywane na pod-tablicach o odpowiednim kształcie.

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

Aby to zilustrować dalej, rozważ pomnożenie tablic 2D i 3D z przystającymi pod-wymiarami.

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

Kiedy stosuje się rozgłaszanie tablicowe?

Nadawanie odbywa się, gdy dwie tablice mają kompatybilne kształty.

Kształty są porównywane komponentowo, zaczynając od tych końcowych. Dwa wymiary są kompatybilne, jeśli są takie same lub jeden z nich ma wartość 1 . Jeśli jeden kształt ma większy wymiar od drugiego, komponenty przekraczające nie są porównywane.

Niektóre przykłady kompatybilnych kształtów:

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

Oto oficjalna dokumentacja dotycząca nadawania w tablicy .

Wypełnij tablicę zawartością pliku CSV

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

Obsługiwanych jest wiele opcji, pełna lista znajduje się w oficjalnej dokumentacji :

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

Numpy n-wymiarowa tablica: ndarray

Podstawową strukturą danych w numpy jest ndarray (skrót od n- wymiarowej tablicy). ndarray s are

  • jednorodny (tzn. zawierają elementy tego samego typu danych)
  • zawierają elementy o stałych rozmiarach (podane przez kształt , krotkę n dodatnich liczb całkowitych, które określają rozmiary każdego wymiaru)

Tablica jednowymiarowa:

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

Tablica dwuwymiarowa:

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)

Trójwymiarowy:

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

Aby zainicjować tablicę bez określania jej zawartości, użyj:

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

Zgadywanie typu danych i automatyczne odlewanie

Typ danych jest domyślnie ustawiony na zmiennoprzecinkowy

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

x.dtype
# dtype('float64')

Jeśli podane zostaną niektóre dane, numpy odgadnie typ danych:

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

Zauważ, że wykonując przypisania, numpy spróbuje automatycznie rzutować wartości, aby pasowały do typu danych 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

Transmisja macierzowa

Zobacz także Operacje tablic rozgłoszeniowych .

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

W terminologii macierzy mielibyśmy macierz 2x2 i wektor wiersza 1x2. Nadal jesteśmy w stanie zrobić sumę

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

Wynika to z tego, że tablica y jest „ rozciągnięta ” w celu:

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

dopasować do kształtu x .

Zasoby:



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow