TypeError: kan niet-itereerbaar int object niet uitpakken

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 0door 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 agg0 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 intde methode __itr__niet bevat, kunnen we deze niet herhalen zoals in listof tupleof 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)

LEAVE A REPLY

Please enter your comment!
Please enter your name here

eleven + eight =

Other episodes