Seite 1 von 1
Array automatisch splitten
Verfasst: Freitag 12. Februar 2021, 09:58
von Bykl
Hallo,
Dieser Code....
Code: Alles auswählen
zeilenarrays=np.array_split(arr,anzahlkaskaden)
print("Zeilenarrays",zeilenarrays)
liefert mir einen gesplittetes Array, welches so aussieht:
Zeilenarrays [array([[1, 0, 0, 0, 1, 0, 0, 0, 0, 0]]), array([[1, 2, 1, 0, 0, 0, 0, 1, 0, 0]]), array([[1, 2, 1, 2, 2, 1, 0, 0, 0, 0]]), array([[1, 2, 1, 2, 2, 1, 2, 2, 2, 1]])]
Nun möchte ich nach dieser Methode:
Code: Alles auswählen
arr1 = np.array([1, 2, 3])
arr2 = np.array([1, 2, 3])
newarr = np.add(arr1, arr2)
die Summe aller übereinanderstehenden Zeilen erhalten. Meine Arrays heißen aber alle gleich. Wie kann ich sie ansprechen? Am liebsten möchte ich, daß sie automatisch array1, array2 etc. heißen. Vielen Dank für Eure Tips
Re: Array automatisch splitten
Verfasst: Freitag 12. Februar 2021, 10:53
von noisefloor
Hallo,
Meine Arrays heißen aber alle gleich.
Kann eigentlich nicht sein, du kannst an einen Namen nur genau ein Objekt binden.
Poste doch bitte mal ein Beispiel, aus dem Ausgangssituation und gewünschtes Ergebnis klar hervorgeht. Bitte als (Pseudo-) Code, nicht nur wortreich beschreiben.
Gruß, noisefloor
Re: Array automatisch splitten
Verfasst: Freitag 12. Februar 2021, 11:07
von Bykl
Was meinst Du mit Pseudocode?
Code: Alles auswählen
from openpyxl import Workbook
from sympy.ntheory import isprime
import matplotlib.pyplot as plt
import numpy as np
from sympy import sieve
from sympy import primepi
from math import sqrt
from collections import Counter
nr=0
anzahlkaskaden=4
altarr = np.array([])
langlist=[]
def ermittel_trigonal(x):
zahl=0
y=x+1
for i in range(1,y):
zahl=zahl+i
return zahl
def bau_kaskaden(x,anzahlkaskaden):
kaskade=[]
w=0
for i in range(0,x,1):
kaskade.append(1) #Hier werden die Stellen der Normkaskade eingetragen)
w=w+1
for y in range(0,w,1):
kaskade.append(2) # Eintrag der Zwischenräume
kaskade.append(1)
for b in range(1,ermittel_trigonal(anzahlkaskaden)+1-len(kaskade),1): #Ermittlung der einzufügenden Zeichen nach größter kaskadenänge berechnet.
kaskade.append(0)
return(kaskade)
for i in range(0,anzahlkaskaden,1):
nr=nr+1
print("Nr.:",nr," ",bau_kaskaden(i,anzahlkaskaden))
langlist.extend(bau_kaskaden(i,anzahlkaskaden))# Konkatenation der einzelnen Kaskaden zur langliste
print()
arr = np.array([langlist])
arr = arr.reshape(anzahlkaskaden, ermittel_trigonal(anzahlkaskaden))#quer
#arr = arr.reshape(ermittel_trigonal(anzahlkaskaden), anzahlkaskaden)#hochkant
print("Fertigarray",arr)
print()
zeilenarrays=np.array_split(arr,anzahlkaskaden)
print("Zeilenarrays",zeilenarrays)
#cumsumarr=np.cumsum(arr)
#print(cumsumarr)
Bein Buch, von Ernesto/Kaiser Python 3 hat nicht mal das Stichwort "array" von wegen Split array?? Versteh ich nicht.
Re: Array automatisch splitten
Verfasst: Freitag 12. Februar 2021, 11:50
von Sirius3
Zum Addieren benutzt man arr1 + arry2. np.add wird sehr selten gebraucht.
array_split liefert eine Liste, und Du mußt halt mit der Liste arbeiten. Das in einzelne Variablen aufzuteilen wäre nicht gut.
Wenn Dein Array exakt in gleich große Arrays aufgespalten werden kann, die dann addiert werden sollen, dann ist aber array_split die falsche Methode, dann benutzt man reshape, wie du das ja schon ein paar Zeilen davor gemacht hast und summiert dann über die passende Achse.
Code: Alles auswählen
zeilenarrays = arr.reshape(-1, anzahlkaskaden)
summe = zeilenarrays.sum(axis=0)
Re: Array automatisch splitten
Verfasst: Freitag 12. Februar 2021, 13:05
von Bykl
Danke Sirius für Deine Weiterhilfe - jetzt besteh folgendes Problem.
Code: Alles auswählen
from openpyxl import Workbook
from sympy.ntheory import isprime
import matplotlib.pyplot as plt
import numpy as np
from sympy import sieve
from sympy import primepi
from math import sqrt
from collections import Counter
nr=0
anzahlkaskaden=4
altarr = np.array([])
langlist=[]
def ermittel_trigonal(x):
zahl=0
y=x+1
for i in range(1,y):
zahl=zahl+i
return zahl
def bau_kaskaden(x,anzahlkaskaden):
kaskade=[]
w=0
for i in range(0,x,1):
kaskade.append(1) #Hier werden die Stellen der Normkaskade eingetragen)
w=w+1
for y in range(0,w,1):
kaskade.append(2) # Eintrag der Zwischenräume
kaskade.append(1)
for b in range(1,ermittel_trigonal(anzahlkaskaden)+1-len(kaskade),1): #Ermittlung der einzufügenden Zeichen nach größter kaskadenänge berechnet.
kaskade.append(0)
return(kaskade)
for i in range(0,anzahlkaskaden,1):
nr=nr+1
print("Nr.:",nr," ",bau_kaskaden(i,anzahlkaskaden))
langlist.extend(bau_kaskaden(i,anzahlkaskaden))# Konkatenation der einzelnen Kaskaden zur langliste
print()
arr = np.array([langlist])
arr = arr.reshape(anzahlkaskaden, ermittel_trigonal(anzahlkaskaden))#quer
#arr = arr.reshape(ermittel_trigonal(anzahlkaskaden), anzahlkaskaden)#hochkant
print("längs")
print(arr)
print("Spaltensummealt",arr[0]+arr[1]+arr[2]+arr[3])
zeilensumme = zeilenarrays.sum(axis=1)
print("Spaltensumme",zeilensumme)
spaltensumme = zeilenarrays.sum(axis=0)
print("Zeilensumme",spaltensumme)
zeilenprod = zeilenarrays.prod(axis=1)
print("Spaltenprod",zeilenprod)
spaltenprod = zeilenarrays.prod(axis=0)
print("Zeilenprod",spaltenprod)
#print("Fertigarray",arr)
#print()
#zeilenarrays=np.array_split(arr,anzahlkaskaden)
#print("Zeilenarrays",zeilenarrays)
#print("Spaltensumme",arr[0]+arr[1]+arr[2]+arr[3])
arr= arr.reshape(ermittel_trigonal(anzahlkaskaden),anzahlkaskaden)
print("quer")
print(arr)
#print("Spaltensummealt",arr[0]+arr[1]+arr[2]+arr[3])
#zeilenarrays = arr.reshape(-1, anzahlkaskaden)
#summe = zeilenarrays.sum(axis=0)
#print("summe",summe)
zeilensumme = zeilenarrays.sum(axis=1)
print("Zeilensumme",zeilensumme)
spaltensumme = zeilenarrays.sum(axis=0)
print("Spaltensumme",spaltensumme)
zeilenprod = zeilenarrays.prod(axis=1)
print("Zeilenprod",zeilenprod)
spaltenprod = zeilenarrays.prod(axis=0)
print("Spaltenprod",spaltenprod)
Was unter Spaltensumme alt kommt ist richtig, und erscheint nach Deiner Methode nicht. Zeilensumme (längs) ist auch nicht richtig. Ich hab die Array's mit ausdrucken lassen, damit man es sofort zieht. Zeile = Waagerecht, Spalte = senkrecht. Und was er bei reshape macht, ist nicht das, was ich mir vorstelle. Es stimmen nach den reshape nämlich nur die oberste und unterste Zeile. So hab ich mir das jedenfalls nicht vorgestellt. Er sollte das Rechteck nur kippen um 90°, wobei jede Ziffer an ihrem Platz bleibt. Er macht es bei reshape aber anders, soweit ich das sehe, lässt er die ganze Kette lang, und legt immer vier ab, bis sie alle ist.
Re: Array automatisch splitten
Verfasst: Freitag 12. Februar 2021, 13:31
von Sirius3
Dann war array_split auch schon nicht das richtige.
Wenn Du schon eine rechteckige Matrix hast, und nur einmal die Spalten und einmal die Zeilen aufsummieren möchtest, dann reicht ja sum mit dem passenden axes-Argument.
Re: Array automatisch splitten
Verfasst: Freitag 12. Februar 2021, 13:52
von Bykl
Naja, ich möchte ja noch mehr üben ... und ich versteh nicht, warum er vor dem reshape dasselbe rechnet, wie nach dem reshape. Gibt es denn einen Befehl "array 90° kippen"?
Re: Array automatisch splitten
Verfasst: Freitag 12. Februar 2021, 14:39
von __blackjack__
@Bykl: Falls es nur um Spalten vs. Zeilensumme geht ist da wie schon gesagt wurde das `axis`-Argument mit dem man angeben kann über welche Achse die Summe gebildet werden soll. Ansonsten heisst das um ”90° kippen” transponieren, und da gibt es in der Tat eine Methode/Funktion für: `transpose()`.
Re: Array automatisch splitten
Verfasst: Freitag 12. Februar 2021, 15:04
von einfachTobi
Das Transponieren entspricht nicht der Drehung um 90°, sondern dem Tauschen von Zeilen und Spalten. Aber es gibt
numpy.rot90().
Code: Alles auswählen
import numpy as np
a = np.array([[1, 2],[3, 4]])
print(a)
print(a.T)
print(np.transpose(a))
print(np.rot90(a))
Re: Array automatisch splitten
Verfasst: Freitag 12. Februar 2021, 20:47
von Bykl
Danke an alle, hatt voll funktioniert, die Klarheit hat die Dunkelheit zurückgedrängt ...!
