2015-09-22 5 views
8

Ich würde gerne wissen, ob es möglich ist, eine Funktion (oder Justierung einer Operation, wie zum Beispiel Werte ersetzen) zu Spalte in einem Python 2d-Array ohne Verwendung von For-Schleifen.Operation auf 2d Array-Spalten

Es tut mir leid, wenn die Frage bereits gestellt wurde, aber ich konnte nichts spezifisch über mein Problem finden.

würde Ich mag, wie etwas zu tun ist:

array[:][2] = 1 

Welche 1 in der dritten Spalte für jeden Wert setzen würde bedeuten, oder

func(array[:][2]) 

Welche gelten würde bedeuten, func() zu die dritte Reihe des Arrays.

Gibt es einen magischen Python-Weg, es zu tun?

EDIT: Die Wahrheit wurde gesprochen. Ich habe vergessen zu sagen, dass ich nicht for() Anweisung vermeiden wollte, um die Leistung zu verbessern, aber nur weil ich nicht wähle, mehrere Zeilen für diese genaue Instanz hinzuzufügen. Wir haben hier zwei Antworten, eine auf native Weise und zwei weitere mit Hilfe von Numpy. Vielen Dank für Ihre Antworten!

Antwort

7

Ohne numpy kann es wie folgt geschehen:

map(lambda x: x[:2] + [1] + x[3:], array) 

map(lambda x: x[:2] + my_func(x[2]) + x[3:], array) 
+0

Es verwendet nicht für, aber es iteriert durch die Liste, die mehr Zeit als nepy Lösung dauert. Wie auch immer, gute Antwort. –

+0

Da ich natives Python verwenden möchte, ist dies die beste Lösung für mich. Danke vielmals ! – Coulis

7

Sie können dies einfach mit numpy Arrays tun. Beispiel -

In [2]: import numpy as np 

In [3]: na = np.array([[1,2,3],[3,4,5]]) 

In [4]: na 
Out[4]: 
array([[1, 2, 3], 
     [3, 4, 5]]) 

In [5]: na[:,2] = 10 

In [6]: na 
Out[6]: 
array([[ 1, 2, 10], 
     [ 3, 4, 10]]) 

In [7]: na[:,2] 
Out[7]: array([10, 10]) 

In [8]: def func(a): 
    ...:  for i,x in enumerate(a): 
    ...:   a[i] = x + 1 
    ...: 

In [9]: na 
Out[9]: 
array([[ 1, 2, 10], 
     [ 3, 4, 10]]) 

In [10]: func(na[:,1]) 

In [11]: na 
Out[11]: 
array([[ 1, 3, 10], 
     [ 3, 5, 10]]) 

können Sie weitere Details zu diesem here finden. Bitte seien Sie vorsichtig, für numpy-Arrays, wie in documentation - angegeben

Alle von Grund Slicing erzeugten Arrays sind immer views des ursprünglichen Arrays.

Dies ist der Grund, warum beim Ändern des in Scheiben geschnittenen Arrays innerhalb der Funktion das tatsächliche Array geändert wurde.

2

Es wäre in numpy sehr einfach und man kann es mit einer einfachen Zuordnung tun:

>>> numpy.array[:,column_number]=value 

Aber wenn Sie auf der Suche nach ein python-Ansatz können Sie zip Funktion und itertools.repeat() verwenden:

>>> from itertools import repeat 
>>> def replacer(l,index,value): 
...  z=zip(*l) 
...  z[index]=list(repeat(value,len(l))) 
...  return zip(*z) 

Demo:

>>> l=[range(4) for _ in range(3)] 
>>> replacer(l,2,'*') 
[(0, 1, '*', 3), (0, 1, '*', 3), (0, 1, '*', 3)] 

Beachten Sie, dass da in Python 3.X zip einen Iterator zurückgibt Sie list Funktion können Sie auch eine Liste zurück, da Iteratoren nicht Indizierung innerhalb der Funktion unterstützt das Sie brauchen auch die Liste aufzurufen.

>>> def replacer(l,index,value): 
...  z=list(zip(*l)) 
...  z[index]=list(repeat(value,len(l))) 
...  return zip(*z) 

>>> list(replacer(l,2,'*')) 
[(0, 1, '*', 3), (0, 1, '*', 3), (0, 1, '*', 3)] 
+0

Sorry für die lange Verzögerung, aber ich möchte etwas wissen. Ist es eine gute Übung, Bibliotheken wie numpy, scipy usw. für ein Spiel zu verwenden? Bei diesem Array-Problem ging es um die Karteninitialisierung für ein 2D-Spiel, aber ich fragte mich, ob es "gut" war, wissenschaftliche Bibliotheken zu verwenden, um meinen Code aufzuhellen. – Coulis

2

können Sie jeder Spalte eine Funktion zuordnen ....

ar = [[1,2,3], 
     [3,4,5], 
     [3,4,5], 
     [3,4,5], 
     [3,4,5]] 

if you want change second column to 100: 

    def column_change(l,n =1 , m =100): 
     l[n] = m 
     return l 

    print(list(map(colum_change,ar))) 

    [[1, 100, 3], [3, 100, 5], [3, 100, 5], [3, 100, 5], [3, 100, 5]]