k33theod Δημοσ. 11 Μαρτίου 2017 Δημοσ. 11 Μαρτίου 2017 (επεξεργασμένο) Έχω κάνει ένα πρόγραμμα σε python για λίστες και θέλω να κάνω μια αλλαγή και δεν μου βγαίνει class ML(list): def reshape(self,*dimesions): dimesions=list(dimesions) mul=1 for i in dimesions: mul*=i if mul!=len(self): raise (ValueError)("The product of dimensions should me equal to {}".format(len(self))) if len(dimesions)>1: current = dimesions.pop() else: # finished! return ML(self) result=[] index=0 while index<len(self) : result.append(list(self[index:index+current])) index+=current return ML.reshape(result,*dimesions) def flatten(self): c=''.join([i for i in str(self)if i not in'[] ']).strip(',') return ML(list(map(int,c.split(',')))) Αυτό κάνει reshape σε μια λίστα flat και τις δίνει τις διαστάσεις που θέλω δηλαδή >>> a=[[1,2,3],[4,5,6],[7,8,9],[10,11,12]] >>> from ml import ML >>> b=ML(a) >>> c=b.flatten() >>> c [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] >>> d=c.reshape(2,6) >>> d [[1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12]] >>> d=d.flatten() >>> d=d.reshape(2,2,3) >>> d [[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]] Πρέπει κάθε φορά που καλώ την reshape να κάνω τη λίστα flat. Καμία ιδέα να μήν χρειάζεται αυτό Επίσης προκειμένου να μου επιστρέψει αντικείμενο ML χρησιμοποιώ πολλές φορές το ML μέσα στη μέθοδο. Πώς μπορώ να το αποφύγω και κάθε άλλη πρόταση για βελτιώση θα με βοηθούσε Επεξ/σία 12 Μαρτίου 2017 από k33theod
k33theod Δημοσ. 12 Μαρτίου 2017 Μέλος Δημοσ. 12 Μαρτίου 2017 (επεξεργασμένο) Είναι κάποιες συναρτήσεις με λίστες που χρησιμοποιώ συχνά και σκέφτηκα να τις τυποποιήσω Για να δουλέψει η reshape χρειάζεται flat λίστα και θέλω να δουλεύει και με άλλες. Τελικά το έκανα και φαίνεται να δουλεύει πρέπει όμως να το ψάξω λίγο ακόμα. Έκανα μια καινούργια μέθοδο και έβαλα μέσα και το flatten. class ML2(list): def reshape(self,*dimesions): self=self.flatten() return self._reshape(*dimesions) def _reshape(self,*dimesions): dimesions=list(dimesions) mul=1 for i in dimesions: mul*=i if mul!=len(self): raise (ValueError)("The product of dimensions should me equal to {}".format(len(self))) if len(dimesions)>1: current = dimesions.pop() else: # finished! return ML2(self) result=[] index=0 while index<len(self) : result.append(list(self[index:index+current])) index+=current return ML2._reshape(result,*dimesions) def flatten(self): c=''.join([i for i in str(self)if i not in'[] ']).strip(',') return ML2(list(map(int,c.split(',')))) Δηλαδή >>> a=[[1,2,3],[4,5,6],[7,8,9],[10,11,12]] >>> from ml import ML2 >>> b=ML2(a) >>> b [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]] >>> c=b.reshape(6,2) >>> c [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10], [11, 12]] Επεξ/σία 12 Μαρτίου 2017 από k33theod
iceblade Δημοσ. 12 Μαρτίου 2017 Δημοσ. 12 Μαρτίου 2017 Γιατί κάνεις reimplement πράγματα που έχουν ήδη υλοποιηθεί με το σωστό τρόπο με τα numpy arrays?
k33theod Δημοσ. 12 Μαρτίου 2017 Μέλος Δημοσ. 12 Μαρτίου 2017 Είναι πράγματα που τα είχα έτοιμα και τα βάζω σε κλάση σαν εξάσκηση και για να τα έχω μαζεμένα. Τα είχα γράψει για ασκήσεις σε πλατφόρμα που δεν μπορείς να κάνεις install άλλες βιβλιοθήκες Το numpy το θεωρώ πολύ σημαντική βιβλιοθήκη για να την προσβάλω 'Δανείστηκα' ονόματα μεθόδων και ιδιοτήτων αλλά η βάση μου είναι το class list ενώ το nd array είναι τελείως διαφορετικό.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα