1. Einführung in Numpy
Ein in Python implementiertes wissenschaftliches Rechnen, einschließlich: 1. Ein leistungsstarkes N-dimensionales Array-Objekt-Array; 2. Eine relativ ausgereifte (Broadcast-)Funktionsbibliothek; 3. Ein Toolkit zur Integration von C/C++- und Fortran-Codes; 4. Praktische lineare Algebra, Fourier-Transformation und Funktionen zur Erzeugung von Zufallszahlen. Es ist bequemer, Numpy und das Sparse-Matrix-Operationspaket Scipy zu verwenden.
NumPy (Numeric Python) bietet viele fortschrittliche numerische Programmierwerkzeuge, wie z. B. Matrixdatentypen, Vektorverarbeitung und anspruchsvolle arithmetische Bibliotheken. Gebaut für ernsthafte digitale Manipulation. Es wird hauptsächlich von vielen großen Finanzunternehmen sowie wichtigen wissenschaftlichen Computerorganisationen wie Lawrence Livermore und der NASA verwendet, um einige Aufgaben zu erledigen, die mit C++, Fortran oder Matlab erledigt worden wären.---"Baidu-Enzyklopädie"
Zweitens: Numpy-Wissenspunkte
1. Installieren Sie das Numpy-Paket und importieren Sie es
pip install numpy
import numpy as np
2. Erstellen Sie ein Array
a = np.array([1, 2, 3, 4, 5])
b = np.arange(0, 6, 1)
c = np.random.random((3, 3))
d = np.random.randint(0, 9, size=(3, 3))
print("a:", a)
print("b:", b)
print("c:", c)
print("d:", d)
① np.array erstellt intuitiv ein Array und alle Eingaben werden generiert.
②np.arange erstellt ein Array und muss die letzte Ziffer und die Schrittgröße des Start- und Endwerts angeben.
③np.random.random Um ein Array zu erstellen, muss die Dimension des Arrays angegeben werden und seine Elemente sind Zufallszahlen zwischen 0 und 1.
④np.random.randint erstellt ein Array N-Ordnung, das das Intervall, zu dem das Element gehört, und die Dimension des Arrays angeben muss. Elemente sind ganze Zahlen.
a: [1 2 3 4 5]
b: [0 1 2 3 4 5]
c: [[0.10739085 0.99541616 0.76174493]
[0.30140398 0.87467374 0.30959958]
[0.23803194 0.47848497 0.38842102]]
d: [[2 0 4]
[7 0 7]
[3 4 5]]
3. Sonderfunktionen
zeros = np.zeros((1, 4))
ones = np.ones((2, 2))
full = np.full((2, 3), 9)
eye = np.eye(3)
① np.zeros generiert ein Array mit angegebenen Abmessungen und alle Elemente sind 0
②np.ones generiert ein Array mit angegebenen Abmessungen und alle Elemente sind 1
③np.full muss die Dimension des Arrays und die Zahl zum Füllen des Arrays angeben
④np.eye generiert ein Array N-Ordnung, mit der Ausnahme, dass die diagonalen Elemente 1 und die anderen Elemente 0 sind
zero: [[0. 0. 0. 0.]]
ones: [[1. 1.]
[1. 1.]]
full [[9 9 9]
[9 9 9]]
eye: [[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
Hinweis: Die Datentypen im Array müssen konsistent sein, einschließlich Ganzzahl und Gleitkomma.
4. Datentyp
Art der Daten | beschreiben | eindeutige Kennung |
bool | Boolescher Typ (True oder False), gespeichert in einem Byte | B |
du8 | Eine Bytegröße, -128 bis 127 | i1 |
int16 | Ganzzahl, 16-stellige Ganzzahl (-32768 ~ 32767) | i2 |
int32 | Ganzzahl, 32-stellige Ganzzahl (-2147483648 ~ 2147483647) | i4 |
int64 | Ganzzahl, 64-stellige Ganzzahl (-9223372036854775808 ~ 9223372036854775807) | i8 |
uint8 | Ganzzahl ohne Vorzeichen, 0 bis 255 | in 1 |
uint16 | Ganzzahl ohne Vorzeichen, 0 bis 65535 | u2 |
uint32 | Ganzzahl ohne Vorzeichen, 0 bis 2 ** 32 - 1 | u4 |
uint64 | Ganzzahl ohne Vorzeichen, 0 bis 2**64 - 1 | u8 |
float16 | Gleitkommazahl mit halber Genauigkeit: 16 Bit, 1 Bit für Vorzeichen, 5 Bit für Exponent, 10 Bit für Genauigkeit | f2 |
float32 | Gleitkommazahl mit einfacher Genauigkeit: 32 Bit, 1 Bit für Vorzeichen, 8 Bit für Exponent, 23 Bit für Genauigkeit | f4 |
float64 | Gleitkommazahl mit einfacher Genauigkeit: 64 Bit, 1 Bit für das Vorzeichen, 11 Bit für den Exponenten und 52 Bit für die Genauigkeit | f8 |
complex64 | Bei komplexen Zahlen werden der Real- und der Imaginärteil jeweils durch zwei 32-Bit-Gleitkommazahlen dargestellt | c8 |
komplex128 | Bei komplexen Zahlen werden der Real- und der Imaginärteil jeweils durch zwei 64-Bit-Gleitkommazahlen dargestellt | c16 |
Objekt_ | Python-Objekt | U |
string_ | Zeichenfolge | S |
Unicode_ | Unicode-Typ | U |
①Erstellen Sie ein Array, um den Datentyp anzugeben
zeros = np.zeros((1, 4), dtype='int16')
ones = np.ones((2, 2), dtype='float32')
zero: [[0 0 0 0]]
ones: [[1. 1.]
[1. 1.]]
②Datentyp abfragen
full = np.full((2, 3), 9, dtype='int8')
eye = np.eye(3, dtype='float16')
print(full.dtype)
print(eye.dtype)
int8
float16
③Datentyp ändern
full = np.full((2, 3), 9, dtype='int8')
print(full.dtype)
full = full.astype('int16')
print(full.dtype)
int8
int16
Notiz:
1. Numpy basiert auf der C-Sprache und bezieht sich auf den Datentyp der C-Sprache.
2. Durch die Zuweisung unterschiedlicher Datentypen zu unterschiedlichen Daten kann effektiv Platz gespart werden.
5. Mehrdimensionales Array
(Im Klartext: Wie viele „[“ stehen vor der ersten angezeigten Zahl und wie viele Dimensionen hat das Array?)
① Definieren Sie eindimensionale, zweidimensionale und dreidimensionale Arrays
arr1 = np.array([1,2,3]) # 一维数组
arr2 = np.array([[1,2,3],[4,5,6]]) # 二维数组
arr3 = np.array([ # 三维数组
[
[1,2,3],
[4,5,6]
],
[
[7,8,9],
[10,11,12]
]
])
②Array-Dimensionsabfrage
print(arr1.shape)
print(arr2.shape)
print(arr3.shape)
③Ändern Sie die Array-Form
a1 = np.array([ # 创建新数组a1
[
[1,2,3],
[4,5,6]
],
[
[7,8,9],
[10,11,12]
]
])
a2 = a1.reshape((2,6)) # 保持元素个数不变的情况下,修改形状为2*6
a3 = a2.flatten() # 铺平为一维向量
④ Zeigen Sie die Anzahl der Elemente und den belegten Speicher an
print(a1.size)
print(a1.itemsize)
print(a1.itemsize * a1.size)
In:
1.a1.size repräsentiert die Anzahl der Array-Elemente
2.a1.itemsize stellt den von einem einzelnen Element belegten Speicher in Bytes dar
3. Die Multiplikation der beiden stellt den gesamten vom Array belegten Speicher dar
6. Array-Indizierung und Slicing
① Eindimensionales Array
a1 = np.arange(10) # [0 1 2 3 4 5 6 7 8 9]
print(a1[4]) # 索引操作
print(a1[4:6]) # 切片操作
print(a1[::2]) # 使用步长
print(a1[-1]) # 使用负数作为索引(从右往左数第一位数字)
[0 1 2 3 4 5 6 7 8 9]
4
[4 5]
[0 2 4 6 8]
9
② Zweidimensionales Array
arr2 = np.random.randint(0,10,size=(4,6))
print(arr2[0]) # 获取第0行数据
print(arr2[1:3]) # 获取第1,2行数据
print(arr2[[0, 2, 3]]) # 获取0,2,3行数据
print(arr2[2, 1]) # 获取第二行第一列数据
print(arr2[[1, 2], [4,5]]) # 获取多个数据 例:第一行第四列、第二行第五列数据
print(arr2[1:3, 4:6]) # 获取多个数据 例:第一、二行的第四、五列的数据
print(arr2[:, 1]) # 获取某一列数据 例:第一列的全部数据
print(arr2[:, [1,3]]) # 获取多列数据 例:第一、三列的全部数据
③ Boolescher Index
a3 = np.arange(24).reshape((4,6))
print(a3[a3<10]) # 挑选出小于10的元素
print(a3[(a3 < 5) | (a3 > 10)]) # 挑选出小于5或者大于10的元素
veranschaulichen:
1. Ob der boolesche Index für dieselben Daten als „True“ oder „False“ extrahiert wird
2. Treffen Sie gleichzeitig die Verwendung von & und treffen Sie eine davon, die verwendet werden kann |
3. Wenn mehrere Bedingungen vorliegen, wird jede Bedingung in Klammern eingeschlossen
7. Ersetzen von Array-Elementwerten:
① Index
a3 = np.random.randint(0,10,size=(3,5))
a3[1] = 0 # 将第一行数据全部更换为0
a3[1] = np.array([1,2,3,4,5]) # 将a3数组第一行数据更换为[1,2,3,4,5]
②Zustandsindex
a3[a3 < 3] = 1 # 数组中值小于3的元素全部替换为1
③ Funktion (verwenden Sie die Where-Funktion, um den Ersatzwert zu realisieren)
result = np.where(a3<5,0,1)
Die Funktion des Codes besteht darin, alle Werte im a3-Array unter 5 durch 0 und die verbleibenden Elemente durch 1 zu ersetzen
8. Array-Broadcasting-Mechanismus
Array-Broadcasting-Prinzip: Zwei Arrays sind Broadcast-kompatibel, wenn die Achsenlängen der abschließenden Dimension (also der vom Ende beginnenden Dimension) übereinstimmen oder eines davon die Länge 1 hat. Die Übertragung erfolgt auf allen und/oder Längen-1-Dimensionen.
①Arrays und digitale Operationen
a1 = np.random.randint(0,5,size=(3,5))
print(a1*2) # 数组中的所有元素都乘2
print(a1.round(2)) # 数组中所有的元素只保留2位小数
②Array- und Array-Operationen
a1 = np.random.randint(0,5,size=(3,5))
a2 = np.random.randint(0,5,size=(3,5)) # a1+a2满足数组广播机制:形状一致
a3 = np.random.randint(0,5,size=(3,4)) # a1+a3不满足:形状不一致的数组不能相加减
a4 = np.random.randint(0,5,size=(3,1)) # a1+a4满足:俩数组行数相同,其中一个数组列数为1
a5 = np.random.randint(0,5,size=(1,5)) # a1+a5满足,俩数组列数相同,其中一个数组行数为1
Zusammenfassen:
1. Arrays können direkt mit Zahlen operieren
2. Die von den beiden Formen gewünschten Arrays können bedient werden
3. Wenn zwei Arrays mit unterschiedlichen Formen Operationen ausführen möchten, hängt es davon ab, ob die beiden das Broadcasting-Prinzip erfüllen
9. Operationen an Array-Formen
①Änderung der Array-Form
a1 = np.random.randint(0,10,size=(3,4))
a2 = a1.reshape((2,6)) # 有返回
a1.resize((4,3)) # 无返回
Der Unterschied zwischen Umformen und Größenänderung:
Sowohl reshape als auch resize werden verwendet, um die Form des Arrays zu ändern, die Ergebnisse sind jedoch unterschiedlich. reshape konvertiert ein Array in eine angegebene Form und gibt dann das konvertierte Ergebnis zurück. resize konvertiert ein Array in eine bestimmte Form, ändert das Array selbst direkt und gibt keinen Wert zurück.
②flatten und ravel (beide konvertieren mehrdimensionale Arrays in eindimensionale Arrays, jedoch auf unterschiedliche Weise)
a3 = np.random.randint(0,10,size=(3,4))
a4 = a3.flatten() # 拷贝一份返回
a5 = a3.ravel() # 返回这个视图的引用
Das heißt:
Eine Änderung des Werts von a4 hat keine Auswirkungen auf a3; eine Änderung des Werts von a5 hat jedoch auch eine Änderung des Werts von a3.
③ Überlagerung von Arrays
vstack: steht für Stapeln in vertikaler Richtung. Die Anzahl der Spalten muss konsistent sein, wenn Sie erfolgreich stapeln möchten.
hstack: steht für horizontales Stapeln, und die Anzahl der Zeilen muss konsistent sein, um erfolgreich gestapelt zu werden.
verketten: Sie können manuell festlegen, in welche Richtung der Achsenparameter überlagert wird.
1>Achse = 0 bedeutet Stapelung in horizontaler Richtung
2>Achse = 1 bedeutet Stapelung in vertikaler Richtung
3>axis = None stellt zunächst die Überlagerung dar und konvertiert sie dann in ein eindimensionales Array
vstack1 = np.random.randint(0,10,size=(3,4)) # 垂直方向待叠加的数组
vstack2 = np.random.randint(0,10,size=(2,4)) # 垂直方向待叠加的数组
vstack3 = np.vstack([vstack1,vstack2]) # 垂直叠加方法一
vstack4 = np.concatenate([vstack1,vstack2],axis=0) # 垂直叠加方法二
h1 = np.random.randint(0,10,size=(3,4)) # 水平方向待叠加的数组
h2 = np.random.randint(0,10,size=(3,1)) # 水平方向待叠加的数组
h3 = np.hstack([h2,h1]) # 水平叠加方法一
h4 = np.concatenate([h2,h1],axis=1) # 水平叠加方法二
h5 = np.concatenate([h2,h1],axis=None) # 先识别垂直或者水平叠加,后转换为一维数组
④ Array-Schnitt
hsplit: Stellt das Schneiden in horizontaler Richtung und das Schneiden nach Spalten dar. Die Schnittmethode ist wie folgt:
1. Geben Sie direkt an, in wie viele Spalten durchschnittlich geschnitten werden soll
2. Geben Sie den Indexwert des Schnitts an
vsplit: Stellt das Schneiden in vertikaler Richtung und das Schneiden nach Linien dar. Schneiden Sie auf die gleiche Weise wie hsplit.
hs1 = np.random.randint(0, 10, size=(3, 4))
np.hsplit(hs1, 2) # 水平方向平均分为2份,要求列数可被此整数整除
np.hsplit(hs1, (1, 2)) # 水平方向分为1,1,2列(在1,2处切割)
[array([[9, 4],
[4, 2],
[4, 7]]), array([[4, 6],
[9, 6],
[7, 3]])]
[array([[9],
[4],
[4]]), array([[4],
[2],
[7]]), array([[4, 6],
[9, 6],
[7, 3]])]
vs1 = np.random.randint(0, 10, size=(4, 5))
np.vsplit(vs1, 4) # 垂直方向平均分为4份
np.vsplit(vs1, (1, 3)) # 垂直方向分为1,2,1行
[array([[0, 3, 7, 4, 7]]), array([[0, 1, 2, 1, 1]]), array([[9, 8, 4, 7, 5]]), array([[9, 8, 2, 7, 1]])]
[array([[0, 3, 7, 4, 7]]), array([[0, 1, 2, 1, 1],
[9, 8, 4, 7, 5]]), array([[9, 8, 2, 7, 1]])]
⑤Matrixtransposition
t1 = np.random.randint(0,10,size=(3,4))
t1.T # 数组t1转置
t2 = t1.transpose() # 返回的是一个view,对返回值上进行修改会影响到原来的数组
10. Ansehen und kopieren
① Handelt es sich nur um eine einfache Aufgabe, wird keine Kopie erstellt
a = np.arange(12)
b = a
print(b is a) # 返回为True,说明b和a是相同的
② flache Kopie
In einigen Fällen werden Variablen kopiert, aber der Speicherplatz, auf den sie verweisen, ist derselbe. Diese Situation wird dann als flache Kopie oder Ansicht (Ansicht) bezeichnet.
c = a.view()
print(c is a) # 返回false,说明c和a栈区空间不同,但是所指向的内存空间是一样的
c[0] = 100 # 修改c的值,a也会受到影响
③ tiefe Kopie
Legen Sie eine vollständige Kopie der vorherigen Daten in einen anderen Speicherbereich, sodass zwei völlig unterschiedliche Werte vorliegen.
d = a.copy()
print(d is a) # 返回false,说明在不同栈区
d[1]=200 # 数组d被修改,而a原封不动,说明两者内存空间不一样。
Zusammenfassen:
Bei Array-Operationen gibt es drei Arten von Kopien:
1. Keine Kopie: direkte Zuweisung, dann wird der Stapelbereich nicht kopiert, sondern es werden unterschiedliche Namen mit demselben Stapelbereich definiert.
2. Flache Kopie: Nur der Stapelbereich wird kopiert, der durch den Stapelbereich angegebene Heap-Bereich wird nicht kopiert.
3. Tiefe Kopie: Sowohl der Stapelbereich als auch der Heap-Bereich werden kopiert
Fortsetzung folgt ~