View Full Version : [Python] Verificare presenza di un array in una lista di array
red.hell
23-04-2009, 11:03
sono di nuovo qui :D
sono leggermente migliorato con la programmazione python, sono riuscito a cominciare l'interfaccia con wxPython ed ogni giorno cerco di incrementarne le funzionalità
ora però ho un probleminolista_diametri_uguali=[]
for indice in range(var.elementi[-1,0]):
uguali=np.nonzero(var.elementi[:,3] == var.elementi[indice,3])[0]
aaa=uguali in lista_diametri_uguali
if aaa:
pass
else:
lista_diametri_uguali.append(uguali)
devo fare una lista contenente gli indici di posizione con i valori ripetuti (per cui con un vettore v=[1,2,1,1,2,3] mi serve una lista l=([0,2,3],[1,4],[5]))
non capisco perchè alla seconda iterazione mi si blocca dando aaa=uguali in lista_diametri_uguali
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
sia che io metta uguali.all() che uguali.any() l'errore è sempre lo stesso
qualche idea? potrei risolvere convertendo l'array in lista, ma non so come si fa (non l'ho trovato neanche sul sito di numpy)
cdimauro
23-04-2009, 12:03
Scusami, sono un po' rimbambito oggi, e non capisco come fai a ottenere l=([0,2,3],[1,4],[5])) da v=[1,2,1,1,2,3]
red.hell
23-04-2009, 12:33
sono poi riuscito a risolvere, ho trovato il comando che trasforma un array in lista uguali=np.ndarray.tolist(uguali)
con quel ciclo analizzo tutti gli elementi di un vettore cercando la ricorsione
provo a spiegartelo brevemente (usando l'esempio di prima):
- v[0] = 1 (non come assegnazione ma come valore)
- np.nonzero(v == v[0]) mi trova gli indici i posizione dei valorio uguali ad elemento0 in vettore (è un vettore anch'esso), per cui [0,2,3]
- controllo se questo vettore è già in lista, se c'è pass, se non c'è lo appendo alla lista (nell'esempio che ti ho fatto prima la lista è inizialmente vuota e poi diventa l=([0,2,3])
- v[1]=2
- np.nonzero(v == v[1]) da [1,4]
- controllo se è in l, non c'è, per cui lo appendo -> l=([0,2,3],[1,4])
- v[2]=1
- np.nonzero(v == v[2]) da ancora [0,2,3]
- è già in l per cui salto
- ... e via così
teoricamente si ha uno spreco di risorse di calcolo (perchè testo tutti i numeri e non controllo prima se posso evitare di cercare), ma non mi interessa perchè i vettori su cui lo uso sono abbastanza corti, massimo 200 elementi circa
cdimauro
23-04-2009, 12:49
Ho capito. E non era nemmeno difficile. Chissà dove avevo la testa. :(
red.hell
23-04-2009, 15:23
ho un altro piccolo problema (forse non molto piccolo)
devo fare un elenco con i vari gruppi e metterci un checkbox ed un pulsante, non so a priori (mentre scrivo il codice) quanti saranno questi gruppi (dipende ovviamente dalle matrici che gli faccio mangiare), devo per cui creare questi componenti con un ciclo
voglio avere abilitato il pulsante solo quando la spunta è attiva
io per ora ho preparato questo codiceclass ElencoDiametri(wx.BoxSizer):
def __init__(self,pannello):
wx.BoxSizer.__init__(self,wx.VERTICAL)
self.pannello=pannello
lista_diametri_uguali=[]
n_gruppi=0
for indice in range(int(var.elementi[-1,0])):
uguali=np.ndarray.tolist(np.nonzero(var.elementi[:,3] == var.elementi[indice,3])[0])
if uguali in lista_diametri_uguali:
pass
else:
lista_diametri_uguali.append(uguali)
n_gruppi=n_gruppi+1
self.Add(wx.StaticText(pannello, -1, 'Seleziona i diametri'),0,wx.EXPAND)
self.Add(wx.StaticLine(pannello), 0, wx.EXPAND|wx.TOP|wx.BOTTOM, 10)
hbox=wx.FlexGridSizer(n_gruppi,2,20,20)
self.gruppo_scelto=[]
for indice in range(n_gruppi):
self.gruppo_scelto.append(False)
self.gruppo=0
id_cb=[]
id_pul=[]
self.corr_id_cb={}
self.coor_id_pul={}
for indice in lista_diametri_uguali:
id_cb.append(wx.NewId())
id_pul.append(wx.NewId())
self.corr_id_cb[id_cb[-1]]=self.gruppo
checkbox=wx.CheckBox(pannello, id_cb[self.gruppo], str(indice))
hbox.Add(checkbox,self.gruppo,0)
pulsante=wx.Button(pannello, id_pul[self.gruppo], "Modifica limiti")
pulsante.Enable(self.gruppo_scelto[self.gruppo])
hbox.Add(pulsante,self.gruppo,1)
checkbox.Bind(wx.EVT_CHECKBOX, self.check_sul_box, checkbox, id=id_cb[self.gruppo])
self.gruppo=self.gruppo+1
self.Add(hbox, 0, wx.EXPAND)
def check_sul_box(self, event):
print event.Checked()
print event.GetId()
if self.gruppo_scelto[self.corr_id_cb[event.GetId()]]:
self.gruppo_scelto[self.corr_id_cb[event.GetId()]]=False
else:
self.gruppo_scelto[self.corr_id_cb[event.GetId()]]=True
self.pannello.Refresh()
però se io ho l'id del pulsante (o del checkbox) come posso cambiare un metodo (per cui passare da .Enable(False) a .Enable(True) e viceversa) su un oggetto senza sapere il nome dell'oggetto ma solo l'ID?
cdimauro
23-04-2009, 15:40
Purtroppo non ho mai sviluppato GUI con Python, per cui non ti posso aiutare.
Mi servirebbe conoscere in che modo è implementata la gerarchia dei componenti, e sono a zero da questo punto di vista. :(
red.hell
23-04-2009, 15:40
mi porta bene scrivere sul forum, un attimo dopo mi viene l'idea buona che mi fa risolvere il problema :D:D:D:D (dovrei spammare di più, ma mi sa che cionci mi cazzia :stordita: )
mi sono creato una lista di oggetti pulsante, vado a prendere l'oggetto nella lista da una determinata posizione
copio solo le ultime righe self.lista_pul=[]
for indice in lista_diametri_uguali:
id_cb.append(wx.NewId())
id_pul.append(wx.NewId())
self.corr_id_cb[id_cb[-1]]=self.gruppo
checkbox=wx.CheckBox(pannello, id_cb[self.gruppo], str(indice))
hbox.Add(checkbox,self.gruppo,0)
pulsante=wx.Button(pannello, id_pul[self.gruppo], "Modifica limiti")
pulsante.Enable(self.gruppo_scelto[self.gruppo])
self.lista_pul.append(pulsante)
hbox.Add(pulsante,self.gruppo,1)
checkbox.Bind(wx.EVT_CHECKBOX, self.check_sul_box, checkbox, id=id_cb[self.gruppo])
self.gruppo=self.gruppo+1
self.Add(hbox, 0, wx.EXPAND)
def check_sul_box(self, event): """evento di check di scelta di un diametro"""
if self.gruppo_scelto[self.corr_id_cb[event.GetId()]]:
self.gruppo_scelto[self.corr_id_cb[event.GetId()]]=False
else:
self.gruppo_scelto[self.corr_id_cb[event.GetId()]]=True
self.lista_pul[self.corr_id_cb[event.GetId()]].Enable(self.gruppo_scelto[self.corr_id_cb[event.GetId()]])
self.pannello.Refresh()
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.