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 ...! :P