hoe kan ik deze fout oplossen Nadat ik mijn code als volgt heb uitgevoerd. Ik gebruik de onderstaande functie en implementeer het uitvoeren van een venster voor een lus, maar krijg uiteindelijk de onderstaande foutmelding. De for-lus werkt en hangt op een punt.
def get_grps(s, thresh=-1, Nmin=3):
"""
Nmin : int > 0
Min number of consecutive values below threshold.
"""
m = np.logical_and.reduce([s.shift(-i).le(thresh) for i in range(Nmin)])
if Nmin > 1:
m = pd.Series(m, index=s.index).replace({False: np.NaN}).ffill(limit=Nmin - 1).fillna(False)
else:
m = pd.Series(m, index=s.index)
# Form consecutive groups
gps = m.ne(m.shift(1)).cumsum().where(m)
# Return None if no groups, else the aggregations
if gps.isnull().all():
return 0
else:
agg = s.groupby(gps).agg([list, sum, 'size']).reset_index(drop=True)
# agg2 = s2.groupby(gps).agg([list, sum, 'size']).reset_index(drop=True)
return agg, gps
data_spi = [-0.32361498 -0.5229471 0.15702732 0.28753752 -0.01069884 -0.8163699
-1.3169327 0.4413181 0.75815576 1.3858147 0.49990863-0.06357133
-0.78432 -0.95337325 -1.663739 0.18965477 0.81183237 0.8360347
0.99537593 -0.12197364 -0.31432647 -2.0865853 0.2084263 0.13332903
-0.05270813 -1.0090573 -1.6578217 -1.2969246 -0.70916456 0.70059913
-1.2127264 -0.659762 -1.1612778 -2.1216285 -0.8054617 -0.6293912
-2.2103117 -1.9373081 -2.530625 -2.4089663 -1.950846 -1.6129876]
lon = data_spi.lon
lat = data_spi.lat
print(len(data_spi))
n=6
for x in range(len(lat)):
for y in range(len(lon)):
if data_spi[0, x, y] != 0:
for i in range(len(data_spi)-70):
ts = data_spi[i:i+10, x, y].fillna(1)
print(ts)
# print(np.array(ts))
agg, gps = get_grps(pd.Series(ts), thresh=-1, Nmin=3)
duration = np.nanmean(agg['sum'])
frequency = len(agg['sum'])
severity = np.abs(np.mean(agg['sum']))
intensity = np.mean(np.abs(agg['sum'] / agg['size']))
print(f'intensity {intensity}')
Ik krijg deze foutmelding
Traceback (most recent call last):
File "/Users/mada0007/PycharmProjects/Research_ass /FREQ_MEAN_INT_DUR_CORR.py", line 80, in <module>
agg, gps = get_grps(pd.Series(ts), thresh=-1, Nmin=3)
typeError: cannot unpack non-iterable int object
Hoe kan ik deze fout oplossen?
Antwoord 1, autoriteit 100%
Vervang gewoon return 0
door return 0, 0
, of beter: geef een foutmelding in plaats van 0 terug te geven
Als uw if
-voorwaarde Waar is, retourneert u alleen 0
. Later, wanneer je agg, gps = get_grps(...)
doet, vertel je python om het resultaat van de functie uit te pakken. Vervolgens verwacht python een iterable van 2 lengtes en probeert het uit te pakken, maar zoals het zegt: het ‘kan niet-iterable int-object niet uitpakken’…
Dus een snelle oplossing is om een tuple (0, 0) te retourneren met return 0, 0
, maar het is nogal slecht omdat je gehele getallen retourneert waar objecten worden verwacht. je script crasht op de volgende regel duration = np.nanmean(agg['sum'])
(aangezien agg
0 is).
Sommige schonere oplossingen om deze zaak aan te pakken, zijn om het een tweede keer uit te pakken:
def get_grps(s, thresh=-1, Nmin=3):
# ...
if gps.isnull().all():
return None
else:
# ...
return agg, gps
for i in range(len(data_spi)-70):
ts = data_spi[i:i+10, x, y].fillna(1)
result = get_grps(pd.Series(ts), thresh=-1, Nmin=3)
if result is None:
break
agg, gps = result
duration = np.nanmean(agg['sum'])
frequency = len(agg['sum'])
Antwoord 2, autoriteit 25%
Er is een soortgelijke fout opgetreden, dus om dit op te lossen plaats ik er een, bijv. in de hoop dat het zal helpen.
Reden: aangezien int
de methode __itr__
niet bevat, kunnen we deze niet herhalen zoals in list
of tuple
of dict{}
.
x,y,z,n = input() # NOT CONVERTING THE INPUT TO 'INT' HERE
l = []
for a in range(0,int(x)): # converting the input to INT
for b in range(0,int(y)): # converting the input to INT
for c in range(0,int(z)): # converting the input to INT
if a+b+c!= n:
l.append([a,b,c])
print(l)