2016-08-17 5 views
1

Ich schreibe ein Skript, um den inneren Zylinder von dem äußeren Zylinder für mehrere Zylinder zu subtrahieren.Python-Array-Manipulation, pi * [n + 1]^2 - pi * [n]^2

zum Beispiel: x = pi*[n+1]**2 - pi*[n]**2

Allerdings bin ich nicht sicher, wie n bekommen von jedem ändern zum Beispiel 1 bis 4, ich will n ändern zu können und hat den Code durch die neuen Werte läuft ohne alles ändern zu müssen.

x = pi*[1]**2 - pi*[0]**2  
x = pi*[2]**2 - pi*[1]**2 
x = pi*[3]**2 - pi*[2]**2 
x = pi*[4]**2 - pi*[3]**2 

Ich habe versucht, eine while-Schleife erhalten zu arbeiten, aber ich kann nicht herausfinden, wie n zu verweisen, ohne ausdrücklich hervorgeht, welche Nummer im Array i verweisen möchten.

Jede Hilfe würde sehr geschätzt werden.

rs = 0.2        # Radius of first cylinder 
rc = 0.4        # Radius of each cylinder (concrete) 
rg = 1         # Radius of each cylinder (soil) 
BW = 3         # No. cylinders (concrete) 
BG = 2         # No. cylinders (soil) 
v1 = np.linspace(rs, rc, num=BW)  # Cylinders (concrete) 
v2 = np.linspace(rc * 1.5, rg, num=BG) # Cylinders (soil) 

n = np.concatenate((v1, v2))   # Combined cylinders 

for i in range(BW + BG): 
    x = np.pi * (n[i + 1] ** 2) - np.pi * (n[i] ** 2) 
+0

Warum nicht können Sie gezielt die Array-Nummer angeben, verweisen auf? Es wäre nützlich, mehr Kontextcode zu geben. –

Antwort

2

Try this:

for n in range(4): # 0 to 3 
    x = pi*[n+1]**2 - pi*[n]**2 #[1] - [0], [2] - [1] and so on... 
    # doSomething 

Wenn [n] ein Index eines Arrays mit dem Namen ist num, ersetzen [n] mit num[n] wie so:

for n in range(4): # 0 to 3 
    x = pi*(num[n+1]**2) - pi*(num[n]**2) #[1] - [0], [2] - [1] and so on... 
    # doSomething 

Wenn statt es einfach war n , ersetzen [n] durch n wie folgt:

for n in range(4): # 0 to 3 
    x = pi*((n+1)**2) - pi*(n**2) #[1] - [0], [2] - [1] and so on... 
    # doSomething 
+1

'pi * [n] ** 2' macht keinen Sinn, da' [n] 'eine Ein-Element-Liste ist. Ich denke, der Fragesteller sollte dafür eine Indizierung sein, also setze stattdessen 'pi * some_sequence [n] ** 2'. – Blckknght

+0

Vielen Dank für die schnelle Antwort, aber sie sind Floats, gibt es eine einfache Möglichkeit, Bereich mit Floats arbeiten zu aktivieren? – Scott

+0

@ScottLines Ich verstehe nicht, was Sie mit "Bereich aktivieren, um mit Floats zu arbeiten?" –

-1

Ich denke, das die Ergebnisse liefern sollten Sie suchen,:

rs = 0.2        # Radius of first cylinder 
rc = 0.4        # Radius of each cylinder (concrete) 
rg = 1         # Radius of each cylinder (soil) 
BW = 3         # No. cylinders (concrete) 
BG = 2         # No. cylinders (soil) 
v1 = np.linspace(rs, rc, num=BW)  # Cylinders (concrete) 
v2 = np.linspace(rc * 1.5, rg, num=BG) # Cylinders (soil) 

n = np.concatenate((v1, v2)) 

results = [] 
for i, v in enumerate(n): 
    if i+1 < len(n): 
     results.append(pi * n[i+1] ** 2 - pi * v ** 2) 
    else: 
     break 
+0

Das bietet genau das, was ich nach, gibt es einen einfachen Weg Um es so zu ändern, speichert es die Werte im Array, anstatt es zu überschreiben? – Scott

1

Wie dies etwa:

for i, value in enumerate(n[:-1]): 
    print(np.pi * (n[i + 1] ** 2) - np.pi * (value ** 2)) 

Für mich ist es druckt:

0.157079632679 
0.219911485751 
0.628318530718 
2.0106192983 

Vielleicht Du willst das:

>>> values = [np.pi * (n[i + 1] ** 2) - np.pi * (value ** 2) 
          for i, value in enumerate(n[:-1])] 
>>> values 
[0.15707963267948971, 0.2199114857512855, 0.62831853071795885, 2.0106192982974673] 

Lässt es erklären:

  • wir alle Elemente in der Liste bekommen müssen, aber das letzte, weil n[i + 1] für das letzte Element ausfällt, so verwenden wir n[0:-1] (wir dürfen auslassen den Beginn der Scheibe, wenn es 0 ist oder das Ende, wenn es gleich oder größer als len(n) ist).
  • enumerate(a_list) kehrt etwas eine Liste von Paaren in Form
    [(0, a_list[0]), (1, a_list[1]), ..., (n, a_list[n)]
  • for i, value in ... auspackt jedes Paar in Variablen namens i und value
  • [something for something in a_list] gibt eine neue Liste ähnelt. Sie können Berechnungen durchführen und die Werte filtern.Zum Beispiel, wenn Sie eine Liste der das Quadrat der geraden Zahlen Balg 10 wollen:
    >>> [x * x for x in range(10) if x % 2 == 1]
    [1, 9, 25, 49, 81]
+0

Das funktioniert ganz gut, ich muss die Werte in einem Array speichern, anstatt sie zu drucken. – Scott

+0

Aktualisiert. Das Geheimnis überspringt den letzten Wert (n [: - 1]), weil es einen nächsten Gegenstand fehlt. Diese Syntax des Listenverständnisses im letzten Snippet ist von der Set-Builder-Notation in Mathe inspiriert und muss daher vertraut sein, wenn Sie mit Mathe arbeiten. –

+0

Danke, das ist genau das, wonach ich suche. – Scott

2

Da Ihre Zahlen sind in einem numpy Array, es ist viel effizienter Sendebetrieb über das Array zu verwenden, (oder Teile davon), anstatt eine explizite Schleife zu schreiben und an einzelnen Elementen zu arbeiten. Dies ist der Hauptgrund, um numpy zu verwenden!

versuchen, etwas wie folgt aus:

# compute your `n` array as before 

areas = pi * n**2 # this will be a new array with the area of each cylinder 
area_differences = areas[1:] - areas[:-1] # differences in area between adjacent cylinders 
+0

Möglicherweise die richtige Antwort. –

+0

Funktioniert auch, danke für Ihre Hilfe. – Scott