Αυτός ο κώδικας Python:
import numpy as p
def firstfunction():
UnFilteredDuringExSummaryOfMeansArray = []
MeanOutputHeader=['TestID','ConditionName','FilterType','RRMean','HRMean',
'dZdtMaxVoltageMean','BZMean','ZXMean','LVETMean','Z0Mean',
'StrokeVolumeMean','CardiacOutputMean','VelocityIndexMean']
dataMatrix = BeatByBeatMatrixOfMatrices[column]
roughTrimmedMatrix = p.array(dataMatrix[1:,1:17])
trimmedMatrix = p.array(roughTrimmedMatrix,dtype=p.float64) #ERROR THROWN HERE
myMeans = p.mean(trimmedMatrix,axis=0,dtype=p.float64)
conditionMeansArray = [TestID,testCondition,'UnfilteredBefore',myMeans[3], myMeans[4],
myMeans[6], myMeans[9], myMeans[10], myMeans[11], myMeans[12],
myMeans[13], myMeans[14], myMeans[15]]
UnFilteredDuringExSummaryOfMeansArray.append(conditionMeansArray)
secondfunction(UnFilteredDuringExSummaryOfMeansArray)
return
def secondfunction(UnFilteredDuringExSummaryOfMeansArray):
RRDuringArray = p.array(UnFilteredDuringExSummaryOfMeansArray,dtype=p.float64)[1:,3]
return
firstfunction()
Δίνει αυτό το μήνυμα σφάλματος:
File "mypath\mypythonscript.py", line 3484, in secondfunction
RRDuringArray = p.array(UnFilteredDuringExSummaryOfMeansArray,dtype=p.float64)[1:,3]
ValueError: setting an array element with a sequence.
Μπορεί κάποιος να μου δείξει τι πρέπει να κάνω για να διορθώσω το πρόβλημα στον παραπάνω σπασμένο κώδικα ώστε να σταματήσει να πετάει μήνυμα σφάλματος;
EDIT: Έκανα μια εντολή εκτύπωσης για να πάρω τα περιεχόμενα του πίνακα, και αυτό είναι αυτό που εκτυπώθηκε:
UnFilteredDuringExSummaryOfMeansArray is:
[['TestID', 'ConditionName', 'FilterType', 'RRMean', 'HRMean', 'dZdtMaxVoltageMean', 'BZMean', 'ZXMean', 'LVETMean', 'Z0Mean', 'StrokeVolumeMean', 'CardiacOutputMean', 'VelocityIndexMean'],
[u'HF101710', 'PreEx10SecondsBEFORE', 'UnfilteredBefore', 0.90670000000000006, 66.257731979420001, 1.8305673000000002, 0.11750000000000001, 0.15120546389880002, 0.26870546389879996, 27.628261216480002, 86.944190346160013, 5.767261352345999, 0.066259118585869997],
[u'HF101710', '25W10SecondsBEFORE', 'UnfilteredBefore', 0.68478571428571422, 87.727887206978565, 2.2965444125714285, 0.099642857142857144, 0.14952476549885715, 0.24916762264164286, 27.010483303721429, 103.5237336525, 9.0682762747642869, 0.085022572648242867],
[u'HF101710', '50W10SecondsBEFORE', 'UnfilteredBefore', 0.54188235294117659, 110.74841107829413, 2.6719262705882354, 0.077705882352917643, 0.15051306356552943, 0.2282189459185294, 26.768787504858825, 111.22827075238826, 12.329456404418824, 0.099814258468417641],
[u'HF101710', '75W10SecondsBEFORE', 'UnfilteredBefore', 0.4561904761904762, 131.52996981880955, 3.1818159523809522, 0.074714285714290493, 0.13459344175047619, 0.20930772746485715, 26.391156337028569, 123.27387909873812, 16.214243779323812, 0.1205685359981619]]
Μου φαίνεται σαν ένας πίνακας 5 γραμμών επί 13 στήλες, αν και ο αριθμός των γραμμών είναι μεταβλητός όταν διαφορετικά δεδομένα εκτελούνται μέσω του σεναρίου. Με τα ίδια δεδομένα που προσθέτω σε αυτό.
EDIT 2: Ωστόσο, το σενάριο εμφανίζει σφάλμα. Επομένως, δεν νομίζω ότι η ιδέα σας εξηγεί το πρόβλημα που συμβαίνει εδώ. Σας ευχαριστώ πάντως. Καμία άλλη ιδέα;
ΣΗΜΕΙΩΣΗ 3:
Πληροφοριακά, αν αντικαταστήσω αυτή την προβληματική γραμμή κώδικα:
RRDuringArray = p.array(UnFilteredDuringExSummaryOfMeansArray,dtype=p.float64)[1:,3]
:
RRDuringArray = p.array(UnFilteredDuringExSummaryOfMeansArray)[1:,3]
Στη συνέχεια, αυτό το τμήμα του σεναρίου λειτουργεί κανονικά χωρίς να εμφανίζει σφάλμα, αλλά στη συνέχεια αυτή η γραμμή κώδικα πιο κάτω στη γραμμή:
p.ylim(.5*RRDuringArray.min(),1.5*RRDuringArray.max())
Εκπέμπει αυτό το σφάλμα:
File "mypath\mypythonscript.py", line 3631, in CreateSummaryGraphics
p.ylim(.5*RRDuringArray.min(),1.5*RRDuringArray.max())
TypeError: cannot perform reduce with flexible type
Έτσι μπορείτε να δείτε ότι πρέπει να καθορίσω τον τύπο δεδομένων για να μπορέσω να χρησιμοποιήσω το ylim στο matplotlib, αλλά παρόλα αυτά ο καθορισμός του τύπου δεδομένων πετάει το μήνυμα λάθους που ξεκίνησε αυτή τη δημοσίευση.
Από τον κώδικα που μας δείξατε, το μόνο πράγμα που μπορούμε να καταλάβουμε είναι ότι προσπαθείτε να δημιουργήσετε έναν πίνακα από μια λίστα που δεν έχει σχήμα πολυδιάστατου πίνακα. Για παράδειγμα
numpy.array([[1,2], [2, 3, 4]])
ή
numpy.array([[1,2], [2, [3, 4]]])
θα δώσει αυτό το μήνυμα σφάλματος, επειδή το σχήμα της λίστας εισόδου δεν είναι ένα (γενικευμένο) "κουτί" που μπορεί να μετατραπεί σε πολυδιάστατο πίνακα. Έτσι, πιθανότατα η UnFilteredDuringExSummaryOfMeansArray
περιέχει ακολουθίες διαφορετικού μήκους.
Επεξεργασία: Μια άλλη πιθανή αιτία για αυτό το μήνυμα σφάλματος είναι η προσπάθεια χρήσης μιας συμβολοσειράς ως στοιχείο σε έναν πίνακα τύπου float
:
numpy.array([1.2, "abc"], dtype=float)
Αυτό είναι που προσπαθείτε σύμφωνα με την επεξεργασία σας. Αν θέλετε πραγματικά να έχετε έναν πίνακα NumPy που να περιέχει τόσο συμβολοσειρές όσο και κινητές μονάδες, θα μπορούσατε να χρησιμοποιήσετε τον τύπο dtype object
, ο οποίος επιτρέπει στον πίνακα να περιέχει αυθαίρετα αντικείμενα της Python:
numpy.array([1.2, "abc"], dtype=object)
Χωρίς να γνωρίζω τι θα πετύχει ο κώδικάς σας, δεν μπορώ να κρίνω αν αυτό είναι αυτό που θέλετε.
Το ValueError της Python:
ValueError: setting an array element with a sequence.
Σημαίνει ακριβώς αυτό που λέει, προσπαθείτε να στριμώξετε μια ακολουθία αριθμών σε μια μόνο αριθμητική υποδοχή. Μπορεί να πεταχτεί κάτω από διάφορες συνθήκες.
1. Όταν περνάτε μια πλειάδα ή μια λίστα της python για να ερμηνευτεί ως στοιχείο πίνακα numpy:
import numpy
numpy.array([1,2,3]) #good
numpy.array([1, (2,3)]) #Fail, can't convert a tuple into a numpy
#array element
numpy.mean([5,(6+7)]) #good
numpy.mean([5,tuple(range(2))]) #Fail, can't convert a tuple into a numpy
#array element
def foo():
return 3
numpy.array([2, foo()]) #good
def foo():
return [3,4]
numpy.array([2, foo()]) #Fail, can't convert a list into a numpy
#array element
2. Προσπαθώντας να στριμώξετε ένα numpy array length > 1 σε ένα numpy array element:
x = np.array([1,2,3])
x[0] = np.array([4]) #good
x = np.array([1,2,3])
x[0] = np.array([4,5]) #Fail, can't convert the numpy array to fit
#into a numpy array element
Δημιουργείται ένας πίνακας numpy και η numpy δεν ξέρει πώς να στριμώχνει πλειάδες ή πίνακες με πολλές τιμές σε υποδοχές ενός στοιχείου. Αναμένει ότι του δίνετε να αξιολογηθεί σε έναν ενιαίο αριθμό, αν δεν το κάνει, το Numpy απαντά ότι δεν ξέρει πώς να ορίσει ένα στοιχείο πίνακα με μια ακολουθία.
Στην περίπτωσή μου, το πρόβλημα ήταν άλλο. Προσπαθούσα να μετατρέψω λίστες λιστών int σε πίνακα. Το πρόβλημα ήταν ότι υπήρχε μια λίστα με διαφορετικό μήκος από τις άλλες. Αν θέλετε να το αποδείξετε, πρέπει να το κάνετε:
print([i for i,x in enumerate(list) if len(x) != 560])
Στην περίπτωσή μου, η αναφορά μήκους ήταν 560.