Array automatisch splitten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Bykl
User
Beiträge: 103
Registriert: Donnerstag 5. Oktober 2017, 17:57

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
Benutzeravatar
noisefloor
User
Beiträge: 4194
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
Bykl
User
Beiträge: 103
Registriert: Donnerstag 5. Oktober 2017, 17:57

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.
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

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)
Bykl
User
Beiträge: 103
Registriert: Donnerstag 5. Oktober 2017, 17:57

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.
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
Bykl
User
Beiträge: 103
Registriert: Donnerstag 5. Oktober 2017, 17:57

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"?
Benutzeravatar
__blackjack__
User
Beiträge: 14054
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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()`.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
einfachTobi
User
Beiträge: 512
Registriert: Mittwoch 13. November 2019, 08:38

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))
Bykl
User
Beiträge: 103
Registriert: Donnerstag 5. Oktober 2017, 17:57

Danke an alle, hatt voll funktioniert, die Klarheit hat die Dunkelheit zurückgedrängt ...! :P
Antworten