Python Numpy-Wissenspunkte

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 ~

Ich denke du magst

Origin blog.csdn.net/m0_64007201/article/details/127656327
Empfohlen
Rangfolge