Heim  >  Artikel  >  Backend-Entwicklung  >  Detailliertes Verständnis des prägnanten NumPy-Tutorials --- Array 2

Detailliertes Verständnis des prägnanten NumPy-Tutorials --- Array 2

高洛峰
高洛峰Original
2017-02-23 16:53:541305Durchsuche

NumPy-Array (2. Array-Operationen)

Grundoperationen

Arithmetische Array-Operationen werden Element für Element ausgeführt. Array-Operationen erstellen ein neues Array, das die Ergebnisse der Operation enthält.

>>> a= np.array([20,30,40,50]) 
>>> b= np.arange( 4) 
>>> b 
array([0, 1, 2, 3]) 
>>> c= a-b 
>>> c 
array([20, 29, 38, 47]) 
>>> b**2 
array([0, 1, 4, 9]) 
>>> 10*np.sin(a) 
array([ 9.12945251,-9.88031624, 7.4511316, -2.62374854]) 
>>> a<35 
array([True, True, False, False], dtype=bool)

Im Gegensatz zu anderen Matrixsprachen werden die Multiplikationsoperatoren in NumPy* Element für Element berechnet. Die Matrixmultiplikation kann mithilfe der Punktfunktion oder durch Erstellen einer implementiert werden Matrixobjekt. (Wird in den folgenden Kapiteln vorgestellt)

>>> A= np.array([[1,1], 
...[0,1]]) 
>>> B= np.array([[2,0], 
...[3,4]]) 
>>> A*B # 逐个元素相乘 
array([[2, 0], 
     [0, 4]]) 
>>> np.dot(A,B) # 矩阵相乘 
array([[5, 4], 
     [3, 4]])

Einige Operatoren wie += und *= werden verwendet, um vorhandene Arrays zu ändern, ohne ein zu erstellen neues Array.

>>> a= np.ones((2,3), dtype=int) 
>>> b= np.random.random((2,3)) 
>>> a*= 3 
>>> a 
array([[3, 3, 3], 
     [3, 3, 3]]) 
>>> b+= a 
>>> b 
array([[ 3.69092703, 3.8324276, 3.0114541], 
      [ 3.18679111, 3.3039349, 3.37600289]]) 
>>> a+= b # b转换为整数类型 
>>> a 
array([[6, 6, 6], 
      [6, 6, 6]])

Wenn das Array Elemente unterschiedlichen Typs speichert, verwendet das Array den Datentyp, der mehr Bits belegt, als seinen eigenen Datentyp, d. h. Bevorzugen Sie einen präziseren Datentyp (dieses Verhalten wird Upcast genannt).

>>> a= np.ones(3, dtype=np.int32) 
>>> b= np.linspace(0,np.pi,3) 
>>> b.dtype.name 
&#39;float64&#39; 
>>> c= a+b 
>>> c 
array([ 1., 2.57079633, 4.14159265]) 
>>> c.dtype.name 
&#39;float64&#39; 
>>> d= exp(c*1j) 
>>> d 
array([ 0.54030231+0.84147098j,-0.84147098+0.54030231j, 
      -0.54030231-0.84147098j]) 
>>> d.dtype.name 
&#39;complex128&#39;

Viele Nicht-Array-Operationen, wie z. B. die Berechnung der Summe aller Elemente eines Arrays, werden bei der Verwendung als Methoden der ndarray-Klasse implementiert Um sie zu verwenden, müssen Sie die Klasseninstanz ndarray verwenden, um diese Methoden aufzurufen.

>>> a= np.random.random((2,3)) 
>>> a 
array([[ 0.65806048, 0.58216761, 0.59986935], 
      [ 0.6004008, 0.41965453, 0.71487337]]) 
>>> a.sum() 
  3.5750261436902333 
>>> a.min() 
   0.41965453489104032 
>>> a.max() 
   0.71487337095581649

Diese Operationen behandeln Arrays als eindimensionale lineare Listen. Sie können jedoch entsprechende Operationen an der angegebenen Achse ausführen, indem Sie den Achsenparameter (d. h. die Zeile des Arrays) angeben:

>>> b= np.arange(12).reshape(3,4) 
>>> b 
array([[ 0, 1, 2, 3], 
      [ 4, 5, 6, 7], 
      [ 8, 9, 10, 11]]) 
>>> b.sum(axis=0) # 计算每一列的和,注意理解轴的含义,参考数组的第一篇文章 
array([12, 15, 18, 21]) 
>>> b.min(axis=1) # 获取每一行的最小值 
array([0, 4, 8]) 
>>> b.cumsum(axis=1) # 计算每一行的累积和 
array([[ 0, 1, 3, 6], 
      [ 4, 9, 15, 22], 
      [ 8, 17, 27, 38]])

Indizierung, Slicing und Iteration

Eindimensionale Arrays können wie Listen und andere Python-Sequenzen indiziert, segmentiert und iteriert werden.

>>> a= np.arange(10)**3 #记住,操作符是对数组中逐元素处理的! 
>>> a 
array([0, 1, 8, 27, 64, 125, 216, 343, 512, 729]) 
>>> a[2] 
8 
>>> a[2:5] 
array([ 8, 27, 64]) 
>>> a[:6:2]= -1000 # 等同于a[0:6:2]= -1000,从开始到第6个位置,每隔一个元素将其赋值为-1000 
>>> a 
array([-1000, 1,-1000, 27,-1000, 125, 216, 343, 512, 729]) 
>>> a[: :-1] # 反转a 
array([ 729, 512, 343, 216, 125,-1000, 27,-1000, 1,-1000]) 
>>>for i in a: 
...  print i**(1/3.), 
... 
nan 1.0 nan 3.0 nan 5.0 6.0 7.0 8.0 9.0

Mehrdimensionale Arrays können einen Index pro Achse haben. Die Indizes werden als durch Kommas getrenntes Tupel angegeben.

>>>def f(x,y): 
...  return 10*x+y 
... 
>>> b= np.fromfunction(f,(5,4),dtype=int) #fromfunction是一个函数,下篇文章介绍。 
>>> b 
array([[ 0, 1, 2, 3], 
      [10, 11, 12, 13], 
      [20, 21, 22, 23], 
      [30, 31, 32, 33], 
      [40, 41, 42, 43]]) 
>>> b[2,3] 
23 
>>> b[0:5, 1] # 每行的第二个元素 
array([ 1, 11, 21, 31, 41]) 
>>> b[: ,1] # 与前面的效果相同 
array([ 1, 11, 21, 31, 41]) 
>>> b[1:3,: ] # 每列的第二和第三个元素 
array([[10, 11, 12, 13], 
      [20, 21, 22, 23]])

Wenn die Anzahl der bereitgestellten Indizes geringer ist als die Anzahl der Achsen, werden die angegebenen Werte in der Reihenfolge ihres Rangs kopiert und die fehlenden Index ist Der Standardwert ist das gesamte Slice:

>>> b[-1] # 最后一行,等同于b[-1,:],-1是第一个轴,而缺失的认为是:,相当于整个切片。 
array([40, 41, 42, 43])

Der Ausdruck in Klammern in b[i] wird als i und eine Reihe von: zur Darstellung behandelt die Ruheachse. Mit NumPy können Sie auch „Punkte“ wie b[i,...] verwenden. Die

Punkte (…) stellen die Anzahl der Semikolons dar, die erforderlich sind, um ein vollständiges Indextupel zu erstellen. Wenn x ein Array mit Rang 5 ist (d. h. es hat 5 Achsen), dann ist:

  • x[1,2,…] äquivalent zu x[1,2,:,: ,:],

  • x[…,3] ist äquivalent zu x[:,:,:,:,3]

  • x [ 4,…,5,:] entspricht x[4,:,:,5,:] 

>>> c= array( [ [[ 0, 1, 2], #三维数组(两个2维数组叠加而成) 
...[ 10, 12, 13]], 
... 
...[[100,101,102], 
...[110,112,113]]] ) 
>>> c.shape 
 (2, 2, 3) 
>>> c[1,...] #等同于c[1,:,:]或c[1] 
array([[100, 101, 102], 
      [110, 112, 113]]) 
>>> c[...,2] #等同于c[:,:,2] 
array([[ 2, 13], 
      [102, 113]])

mehrdimensionales Array Die Durchquerung basiert auf der ersten Achse:

>>>for row in b: 
...  print row 
... 
[0 1 2 3] 
[10 11 12 13] 
[20 21 22 23] 
[30 31 32 33] 
[40 41 42 43]

Wenn Sie jedes Element im Array verarbeiten möchten, können Sie das flache Attribut verwenden , dieses Attribut ist ein Array-Element-Iterator:

>>>for element in b.flat: 
...  print element, 
... 
0 1 2 3 10 11 12 13 20 21 22 23 30 31 32 33 40 41 42 43

Formoperation

Ändern der Form eines Arrays

Die Form eines Arrays hängt von der Anzahl der Elemente auf jeder Achse ab:

>>> a= np.floor(10*np.random.random((3,4))) 
>>> a 
array([[ 7., 5., 9., 3.], 
      [ 7., 2., 7., 8.], 
      [ 6., 8., 3., 2.]]) 
>>> a.shape 
(3, 4)

Die Form eines Arrays kann auf verschiedene Arten geändert werden:

>>> a.ravel() # 平坦化数组 
array([ 7., 5., 9., 3., 7., 2., 7., 8., 6., 8., 3., 2.]) 
>>> a.shape= (6, 2) 
>>> a.transpose() 
array([[ 7., 9., 7., 7., 6., 3.], 
      [ 5., 3., 2., 8., 8., 2.]])

Die Reihenfolge der durch ravel() abgeflachten Array-Elemente ist Normalerweise basiert der „C-Stil“ auf dem Verhalten und der Index ganz rechts ändert sich am schnellsten, sodass auf das Element a[0,0] ein [0,1] folgt. Wenn das Array in eine andere Form umgeformt wird, ist das Array immer noch „C-Stil“. NumPy erstellt normalerweise ein Array, das die Daten in dieser Reihenfolge enthält, sodass ravel() normalerweise keine Kopie des aufrufenden Arrays erstellen muss. Wenn das Array jedoch in ein anderes Array unterteilt ist oder ungewöhnliche Optionen aufweist, müssen Sie möglicherweise eine Kopie davon erstellen. Sie können auch einige optionale Parameterfunktionen verwenden, um reshape() und ravel() ein Array im FORTRAN-Stil erstellen zu lassen, d. h. der Index ganz links ändert sich am schnellsten.

Die Reshape-Funktion ändert die Form des aufrufenden Arrays und gibt das Array zurück, während die Resize-Funktion das aufrufende Array selbst ändert.

>>> a 
array([[ 7., 5.], 
      [ 9., 3.], 
      [ 7., 2.], 
      [ 7., 8.], 
      [ 6., 8.], 
      [ 3., 2.]]) 
>>> a.resize((2,6)) 
>>> a 
array([[ 7., 5., 9., 3., 7., 2.], 
      [ 7., 8., 6., 8., 3., 2.]])

Wenn eine Abmessung im Umformvorgang als -1 angegeben wird, wird die genaue Abmessung basierend auf der tatsächlichen Situation berechnet

Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass er zum Lernen aller beiträgt. Ich hoffe auch, dass jeder die PHP-Chinesisch-Website unterstützt.

Für ein tieferes Verständnis der prägnanten Tutorial---Array 2-bezogenen Artikel von NumPy schauen Sie sich bitte die chinesische PHP-Website an!


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