Heim  >  Artikel  >  Backend-Entwicklung  >  Detailliertes Verständnis des prägnanten NumPy-Tutorials --- Array 3 (Kombination)

Detailliertes Verständnis des prägnanten NumPy-Tutorials --- Array 3 (Kombination)

高洛峰
高洛峰Original
2017-02-23 16:55:181248Durchsuche

Die ersten beiden Artikel gaben eine grundlegende Einführung in NumPy-Arrays. Dieser Artikel bietet eine ausführlichere Diskussion über NumPy-Arrays. Zuerst stellen wir Arrays benutzerdefinierter Typen vor, dann die Kombination von Arrays und schließlich stellen wir die Probleme des Array-Kopierens vor.

Benutzerdefiniertes Strukturarray

Strukturtypen wie die C-Sprache können auch über NumPy definiert werden. Die Methode zum Definieren einer Struktur in NumPy ist wie folgt:

Definieren Sie den Strukturtypnamen; definieren Sie den Feldnamen und geben Sie den Felddatentyp an.

student= dtype({'names':['name', 'age', 'weight'], 'formats':['S32', 'i','f']}, align = True)

Hier ist student der Name des benutzerdefinierten Strukturtyps, der mit der dtype-Funktion erstellt wurde, im ersten Parameter „names“ und „Formate“ können nicht geändert werden. „Names“ listet die Feldnamen in der Struktur auf, und „Formate“ listet die Datentypen der entsprechenden Felder auf. S32 stellt eine Zeichenfolge mit einer Länge von 32 Byte dar, i stellt eine 32-Bit-Ganzzahl dar und f stellt eine 32-Bit-Gleitkommazahl dar. Wenn der letzte Parameter „True“ ist, bedeutet dies, dass eine Speicherausrichtung erforderlich ist.

Die Zeichenkodierung von NumPy wird im Feld verwendet, um den Datentyp darzustellen. Ausführlichere Datentypen finden Sie in der folgenden Tabelle.


数据类型 字符编码
整数 i
无符号整数 u
单精度浮点数 f
双精度浮点数 d
布尔值 b
复数 D
字符串 S
Unicode U
Void V

Nachdem Sie den Strukturtyp definiert haben, können Sie ein Array mit diesem Typ als seinen Elementen definieren:

a= array([(“Zhang”, 32, 65.5), (“Wang”, 24, 55.2)], dtype =student)

Zusätzlich zur Auflistung der Daten der entsprechenden Felder in jedem Element müssen Sie im letzten Parameter der Array-Funktion auch den entsprechenden Datentyp angeben.

Funktionen kombinieren

Hier sind die verschiedenen Möglichkeiten, Funktionen zu kombinieren. Erstellen Sie zunächst zwei Arrays:

>>> a = arange(9).reshape(3,3) 
>>> a 
array([[0, 1, 2], 
   [3, 4, 5], 
   [6, 7, 8]]) 
>>> b = 2 * a 
>>> b 
array([[ 0, 2, 4], 
  [ 6, 8, 10], 
  [12, 14, 16]])

Horizontale Kombination

>>> hstack((a, b)) 
array([[ 0, 1, 2, 0, 2, 4], 
  [ 3, 4, 5, 6, 8, 10], 
  [ 6, 7, 8, 12, 14, 16]])

Dieser Effekt kann auch durch die Verkettungsfunktion und Angabe der entsprechenden Achse erzielt werden:

>>> concatenate((a, b), axis=1) 
array([[ 0, 1, 2, 0, 2, 4], 
  [ 3, 4, 5, 6, 8, 10], 
  [ 6, 7, 8, 12, 14, 16]])

Vertikale Kombination

>>> vstack((a, b)) 
array([[ 0, 1, 2], 
  [ 3, 4, 5], 
  [ 6, 7, 8], 
  [ 0, 2, 4], 
  [ 6, 8, 10], 
  [12, 14, 16]])

In ähnlicher Weise kann dies durch die Verkettungsfunktion und die Angabe des entsprechenden Achseneffekts erreicht werden.

>>> concatenate((a, b), axis=0) 
array([[ 0, 1, 2], 
  [ 3, 4, 5], 
  [ 6, 7, 8], 
  [ 0, 2, 4], 
  [ 6, 8, 10], 
  [12, 14, 16]])

Tiefenkombination

Darüber hinaus gibt es Tiefenkombinationsfunktionen dstack . Wie der Name schon sagt, wird es auf der dritten Achse des Arrays (d. h. der Tiefe) kombiniert. Wie folgt:

>>> dstack((a, b)) 
array([[[ 0, 0], 
  [ 1, 2], 
  [ 2, 4]], 
 
  [[ 3, 6], 
  [ 4, 8], 
  [ 5, 10]], 
 
  [[ 6, 12], 
  [ 7, 14], 
  [ 8, 16]]])

Schauen Sie genau hin und stellen Sie fest, dass die entsprechenden Elemente in einer neuen Liste zusammengefasst sind, die als Element von verwendet wird neues Array.

Zeilenkombination

Zeilenkombination kombiniert mehrere eindimensionale Arrays als jede Zeile eines neuen Arrays:

>>> one = arange(2) 
>>> one 
array([0, 1]) 
>>> two = one + 2 
>>> two 
array([2, 3]) 
>>> row_stack((one, two)) 
array([[0, 1], 
  [2, 3]])

Bei 2D-Arrays funktioniert dies wie eine vertikale Kombination.

Spaltenkombination

Der Effekt der Spaltenkombination sollte klar sein. Wie folgt:

>>> column_stack((oned, twiceoned)) 
array([[0, 2], 
  [1, 3]])

Bei zweidimensionalen Arrays funktioniert es wie eine horizontale Kombination.

Array teilen

In NumPy umfassen die Funktionen zum Teilen von Arrays hsplit, vsplit, dsplit und split. Sie können das Array in Unterarrays gleicher Größe aufteilen oder den Ort angeben, an dem das ursprüngliche Array aufgeteilt wird.

Horizontal teilen

>>> a = arange(9).reshape(3,3) 
>>> a 
array([[0, 1, 2], 
  [3, 4, 5], 
  [6, 7, 8]]) 
>>> hsplit(a, 3) 
[array([[0], 
  [3], 
  [6]]), 
 array([[1], 
  [4], 
  [7]]), 
 array([[2], 
  [5], 
  [8]])]

Rufen Sie auch die Teilungsfunktion auf und geben Sie die Achse als 1 bis an Erhalten Sie diesen Effekt:

split(a, 3, axis=1)

Vertikale Aufteilung

Die vertikale Aufteilung erfolgt entlang die vertikale Achse schneidet die Gruppe:

>>> vsplit(a, 3) 
>>> [array([[0, 1, 2]]), array([[3, 4, 5]]), array([[6, 7, 8]])]

In ähnlicher Weise können Sie auch die Solit-Funktion verwenden und die Achse als 1 angeben, um eine solche zu erhalten ein Effekt:

>>> split(a, 3, axis=0)

Tiefenorientierte Segmentierung

Die dsplit-Funktion verwendet Tiefenorientierte Segmentierungsmethode:

>>> c = arange(27).reshape(3, 3, 3) 
>>> c 
array([[[ 0, 1, 2], 
  [ 3, 4, 5], 
  [ 6, 7, 8]], 
 
  [[ 9, 10, 11], 
  [12, 13, 14], 
  [15, 16, 17]], 
 
  [[18, 19, 20], 
  [21, 22, 23], 
  [24, 25, 26]]]) 
>>> dsplit(c, 3) 
[array([[[ 0], 
  [ 3], 
  [ 6]], 
 
  [[ 9], 
  [12], 
  [15]], 
 
  [[18], 
  [21], 
  [24]]]), 
 array([[[ 1], 
  [ 4], 
  [ 7]], 
 
  [[10], 
  [13], 
  [16]], 
 
  [[19], 
  [22], 
  [25]]]), 
 array([[[ 2], 
  [ 5], 
  [ 8]], 
 
  [[11], 
  [14], 
  [17]], 
 
  [[20], 
  [23], 
  [26]]])]

Kopieren und Spiegeln (Ansicht)

Beim Berechnen der Summe Beim Arbeiten mit Arrays werden deren Daten manchmal in das neue Array kopiert und manchmal nicht. Dies führt bei Neulingen oft zu Verwirrung. Hierfür gibt es drei Fälle:

Überhaupt kein Kopieren

Einfache Zuweisung ohne Kopieren der Array-Objekte oder deren Daten.

>>> a = arange(12) 
>>> b = a  #不创建新对象 
>>> b is a   # a和b是同一个数组对象的两个名字 
True 
>>> b.shape = 3,4 #也改变了a的形状 
>>> a.shape 
(3, 4) 
    Python 传递不定对象作为参考4,所以函数调用不拷贝数组。
 >>> def f(x): 
...  print id(x) 
... 
>>> id(a)  #id是一个对象的唯一标识 
148293216 
>>> f(a) 
148293216

Ansicht und flaches Kopieren

verschiedene Array-Objekte teilen dieselben Daten . Die Ansichtsmethode erstellt ein neues Array-Objekt, das auf dieselben Daten zeigt.

>>> c = a.view() 
>>> c is a 
False 
>>> c.base is a  #c是a持有数据的镜像 
True 
>>> c.flags.owndata 
False 
>>> 
>>> c.shape = 2,6 # a的形状没变 
>>> a.shape 
(3, 4) 
>>> c[0,4] = 1234  #a的数据改变了 
>>> a 
array([[ 0, 1, 2, 3], 
  [1234, 5, 6, 7], 
  [ 8, 9, 10, 11]])

Ein geschnittenes Array gibt eine Ansicht davon zurück:

>>> s = a[ : , 1:3]  # 获得每一行1,2处的元素 
>>> s[:] = 10   # s[:] 是s的镜像。注意区别s=10 and s[:]=10 
>>> a 
array([[ 0, 10, 10, 3], 
  [1234, 10, 10, 7], 
  [ 8, 10, 10, 11]])

Deep Copy

Diese Kopiermethode kopiert das Array und seine Daten vollständig.

 >>> d = a.copy()  #创建了一个含有新数据的新数组对象 
>>> d is a 
False 
>>> d.base is a  #d和a现在没有任何关系 
False 
>>> d[0,0] = 9999 
>>> a 
array([[ 0, 10, 10, 3], 
  [1234, 10, 10, 7], 
  [ 8, 10, 10, 11]])

Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass er für das Lernen aller hilfreich sein wird wird die chinesische PHP-Website unterstützen.

Für ein tieferes Verständnis des prägnanten Tutorials von NumPy – Artikel zum Thema Array 3 (Kombination) beachten Sie bitte die chinesische PHP-Website!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn