2016-03-20 19 views
-1

machen Ich habe eine bestehende numpy Array wie folgt:Wie Elemente numpy Array hinzufügen und neue numpy Array

boxes = np.array([ 
     (59, 119, 175, 14), 
     (147, 107, 66, 11)]) 

Ich möchte eine neue numpy Array aus der obigen numpy Array machen, so dass:

element 2 = element 0 + element 2 
element 3 = element 1 + element 3 

dh

(59, 119, 234, 133), 
(147, 108, 213, 119) 

Antwort

1

Für Ihr spezielles Problem, können Sie ein neues numpy Array machen, wo die ersten beiden Spalten der gleichen und die Spalten 2 und 3 (0 basierte Indexierung) sind das Ergebnis der Summe zwischen ihnen und den Spalten bleiben 0 und 1 unter Verwendung column_stack, die Arrays als Spalten stapeln können.

der Code mit Ihrem Beispiel Insbesondere würde wie folgt aussehen:

boxes = np.array([(59, 119, 175, 14), (147, 107, 66, 11)]) 
np.column_stack([boxes[:,0], boxes[:,1], boxes[:,2]+boxes[:,0], boxes[:,3]+boxes[:,1]]) 

und der Ausgang

array([[ 59, 119, 234, 133], [147, 107, 213, 118]]) 

ist Wenn Sie eine allgemeinere Aktualisierungsregel, möglicherweise kann dieser Code verallgemeinert werden und somit Die Matrix kann iterativ spaltenweise mit der Funktion concatenate erstellt werden.

0

ich glaube, ich erwartete ich einige Erklärungen zu meinen Code zu befestigen, aber ich weiß wirklich nicht, was ex einfach. Sie sollten wirklich die Dokumente lesen.

res = boxes.copy() 
res[:, 2] += res[:, 0] 
res[:, 3] += res[:, 1] 
res 

array([[ 59, 119, 234, 133], 
     [147, 107, 213, 118]]) 
+0

Mein Code aktualisiert Spalten 2 und 3 wie angegeben unabhängig von der Arraygröße, solange mindestens 4 Spalten vorhanden sind. – Goyo

+0

Wenn Sie column_n = column_n + column_ (n-2) für n> 2 bedeuten, können Sie Ihre Frage bearbeiten. – Goyo

0

Dies ist nicht besser als die anderen Antworten, für das, was es wert ist ..

import numpy as np 

boxes = np.array([ 
     (59, 119, 175, 14), 
     (147, 107, 66, 11)]) 

new_boxes = np.hstack([ 
    boxes[:,0].reshape((2,1)), 
    boxes[:,1].reshape((2,1)), 
    (boxes[:,0]+boxes[:,2]).reshape((2,1)), 
    (boxes[:,1]+boxes[:,3]).reshape((2,1))]) 

ergibt:

array([[ 59, 119, 234, 133], 
     [147, 107, 213, 118]]) 
0

Dieses mit einem Zusatz Ausdruck (ein erreicht werden kann, die eine ganze Griffe 2x2 Block auf einmal).

In [137]: boxes = np.array([ 
     (59, 119, 175, 14), 
     (147, 107, 66, 11)]) 
In [138]: res = boxes.copy() 
In [139]: res[:,2:] += res[:,:2] 
In [140]: res 
Out[140]: 
array([[ 59, 119, 234, 133], 
     [147, 107, 213, 118]]) 

Man könnte es die Kopie überspringen, wenn Sie boxes selbst modifizieren nichts ausmacht.

Die Summe auch mit einer reshape und Summe werden berechnen kann:

In [142]: boxes.reshape(2,2,2).sum(axis=1) 
Out[142]: 
array([[234, 133], 
     [213, 118]]) 

, die mich zu einer anderen Lösung führt, mit cumsum:

In [143]: np.cumsum(boxes.reshape(2,2,2),axis=1) 
Out[143]: 
array([[[ 59, 119], 
     [234, 133]], 

     [[147, 107], 
     [213, 118]]], dtype=int32) 
In [144]: np.cumsum(boxes.reshape(2,2,2),axis=1).reshape(2,4) 
Out[144]: 
array([[ 59, 119, 234, 133], 
     [147, 107, 213, 118]], dtype=int32) 

Scheiben und neu zu gestalten sind zwei praktische Wege der Zusammenarbeit mit Blöcke eines Arrays.