Frage

Ich habe ein 2D-Array, das wie folgt aussieht:

XX
xx

Was ist der effizienteste Weg, eine zusätzliche Zeile und Spalte hinzuzufügen:

xxy
xxy
yyy

Für Bonuspunkte, würde ich gerne auch in der Lage sein, einzelne Zeilen und Spalten, knock out, so zum Beispiel in der Matrix unten Ich möchte in der Lage sein, all das eines ist nur das x verläßt, knock out - speziell ich versuche, die n-te Zeile und die n-te Spalte in der gleichen Zeit zu löschen - und ich möchte in der Lage sein, dies so schnell wie möglich zu tun:

xxaxx
xxaxx
aaaaa
xxaxx
xxaxx
War es hilfreich?

Lösung

Die kürzesten in Bezug auf den Codezeilen i denken kann, ist für die erste Frage.

>>> import numpy as np
>>> p = np.array([[1,2],[3,4]])

>>> p = np.append(p, [[5,6]], 0)
>>> p = np.append(p, [[7],[8],[9]],1)

>>> p
array([[1, 2, 7],
   [3, 4, 8],
   [5, 6, 9]])

Und die für die zweite Frage

    p = np.array(range(20))
>>> p.shape = (4,5)
>>> p
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19]])
>>> n = 2
>>> p = np.append(p[:n],p[n+1:],0)
>>> p = np.append(p[...,:n],p[...,n+1:],1)
>>> p
array([[ 0,  1,  3,  4],
       [ 5,  6,  8,  9],
       [15, 16, 18, 19]])

Andere Tipps

Eine nützliche alternative Antwort auf die erste Frage, die Beispiele aus mit tomeedee Antwort wäre numpy der verwenden vstack und column_stack Methoden:

Bei einer Matrix p,

>>> import numpy as np
>>> p = np.array([ [1,2] , [3,4] ])

eine erweiterte Matrix kann erzeugt werden:

>>> p = np.vstack( [ p , [5 , 6] ] )
>>> p = np.column_stack( [ p , [ 7 , 8 , 9 ] ] )
>>> p
array([[1, 2, 7],
       [3, 4, 8],
       [5, 6, 9]])

Diese Verfahren können als np.append in der Praxis günstig sein (), da sie erlauben, 1D-Arrays ohne jegliche Modifikation an eine Matrix angehängt werden, im Gegensatz zu dem folgende Szenario:

>>> p = np.array([ [ 1 , 2 ] , [ 3 , 4 ] , [ 5 , 6 ] ] )
>>> p = np.append( p , [ 7 , 8 , 9 ] , 1 )
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/dist-packages/numpy/lib/function_base.py", line 3234, in append
    return concatenate((arr, values), axis=axis)
ValueError: arrays must have same number of dimensions

In Antwort auf die zweite Frage, eine schöne Möglichkeit, Zeilen und Spalten zu entfernen, ist logische Array-Indizierung wie folgt zu verwenden:

Bei einer Matrix p,

>>> p = np.arange( 20 ).reshape( ( 4 , 5 ) )

nehmen wir Zeile 1 und Spalte entfernen möchten 2:

>>> r , c = 1 , 2
>>> p = p [ np.arange( p.shape[0] ) != r , : ] 
>>> p = p [ : , np.arange( p.shape[1] ) != c ]
>>> p
array([[ 0,  1,  3,  4],
       [10, 11, 13, 14],
       [15, 16, 18, 19]])

Hinweis - für reformierte Matlab Benutzer - wenn Sie diese in einem Einzeiler Sie müssen Index zweimal tun wollte:

>>> p = np.arange( 20 ).reshape( ( 4 , 5 ) )    
>>> p = p [ np.arange( p.shape[0] ) != r , : ] [ : , np.arange( p.shape[1] ) != c ]

Diese Technik kann auch Sätze von Zeilen und Spalten entfernen erweitert werden, so dass, wenn wir 1 Reihe 0, 2 und Spalten entfernen wollten, 2 & 3 wir numpy verwenden könnten setdiff1d Funktion des gewünschten logischen Index zu generieren:

>>> p = np.arange( 20 ).reshape( ( 4 , 5 ) )
>>> r = [ 0 , 2 ]
>>> c = [ 1 , 2 , 3 ]
>>> p = p [ np.setdiff1d( np.arange( p.shape[0] ), r ) , : ] 
>>> p = p [ : , np.setdiff1d( np.arange( p.shape[1] ) , c ) ]
>>> p
array([[ 5,  9],
       [15, 19]])

Eine weitere elegante Lösung für die ersten Frage kann der insert Befehl sein:

p = np.array([[1,2],[3,4]])
p = np.insert(p, 2, values=0, axis=1) # insert values before column 2

führt zu:

array([[1, 2, 0],
       [3, 4, 0]])

insert kann langsamer sein als append aber können Sie die ganze Zeile / Spalte mit einem Wert leicht füllen.

Wie für die zweite Frage , delete hat vor vorgeschlagen worden:

p = np.delete(p, 2, axis=1)

, die die ursprüngliche Anordnung wieder her wieder:

array([[1, 2],
       [3, 4]])

Ich finde es viel einfacher zu „verlängern“ über in einer größeren Matrix zuweisen. Z.

import numpy as np
p = np.array([[1,2], [3,4]])
g = np.array(range(20))
g.shape = (4,5)
g[0:2, 0:2] = p

Hier sind die Arrays:

p

   array([[1, 2],
       [3, 4]])

g:

array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19]])

und der resultierende g nach Zuordnung:

   array([[ 1,  2,  2,  3,  4],
       [ 3,  4,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19]])

Sie können mit:

>>> np.concatenate([array1, array2, ...]) 

z.

>>> import numpy as np
>>> a = [[1, 2, 3],[10, 20, 30]]
>>> b = [[100,200,300]]
>>> a = np.array(a) # not necessary, but numpy objects prefered to built-in
>>> b = np.array(b) # "^
>>> a
array([[ 1,  2,  3],
       [10, 20, 30]])
>>> b
array([[100, 200, 300]])
>>> c = np.concatenate([a,b])
>>> c
array([[  1,   2,   3],
       [ 10,  20,  30],
       [100, 200, 300]])
>>> print c
[[  1   2   3]
 [ 10  20  30]
 [100 200 300]]

~ - + - ~ - + - ~ - + - ~

Manchmal werden Sie über Probleme, wenn ein numpy Array-Objekt mit unvollständigen Werten für seine Form Eigenschaft initialisiert wird. Dieses Problem wird behoben, indem die Tupel der Form Eigenschaft zuweisen. (Array_length, element_length)

Hinweis: Hier ‚array_length‘ und ‚element_length‘ ganzzahlige Parameter, die Sie Ersatzwerte in für. A 'tuple' ist nur ein Paar von Zahlen in Klammern angegeben.

z.

>>> import numpy as np
>>> a = np.array([[1,2,3],[10,20,30]])
>>> b = np.array([100,200,300]) # initialize b with incorrect dimensions
>>> a.shape
(2, 3)
>>> b.shape
(3,)
>>> c = np.concatenate([a,b])

Traceback (most recent call last):
  File "<pyshell#191>", line 1, in <module>
    c = np.concatenate([a,b])
ValueError: all the input arrays must have same number of dimensions
>>> b.shape = (1,3)
>>> c = np.concatenate([a,b])
>>> c
array([[  1,   2,   3],
       [ 10,  20,  30],
       [100, 200, 300]])

vielleicht brauchen Sie diese.

>>> x = np.array([11,22])
>>> y = np.array([18,7,6])
>>> z = np.array([1,3,5])
>>> np.concatenate((x,y,z))
array([11, 22, 18,  7,  6,  1,  3,  5])
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top