web-dev-qa-db-ger.com

TypeError: Das Zip-Argument # 2 muss die Iteration unterstützen

Ich habe einen Fehler erhalten TypeError: Zip-Argument # 2 muss Iteration unterstützen.

data = libraries.pd.read_csv('a.csv',header=1, parse_dates=True)
datas = DataCleaning.DataCleaning(data)
datas.cleaning(media)

calDf = datas.getDatas()

array_x = libraries.np.int32(libraries.np.zeros(len(calDf)))
array_y = libraries.np.int32(libraries.np.zeros(len(calDf)))


if len(calDf) > 1:
    for num in range(len(calDf)):
        array_x[num] = calDf.iloc[num,0]
        array_y[num] = calDf.iloc[num,1]

    def nonlinear_fit(x,a,b):
        return  b * libraries.np.exp(x / (a+x))

    prameter_initial = libraries.np.array([0,0])

    try:
        param, cov = libraries.curve_fit(nonlinear_fit, array_x, array_y, maxfev=5000)

    except RuntimeError:
        print("Error - curve_fit failed")

li_result = []
li_result = Zip(y, array_x, array_y)

Ich denke, der Teil von Zip(y, array_x, array_y) ist falsch, weil die Argumente von Zip nicht vom Listentyp sind, schrieb ich

for i in y:
 li_result = []
 li_result = Zip(y, array_x[i], array_y[i])

aber ich habe einen fehler

li_result = Zip(y, array_x[i], array_y[i])
IndexError: only integers, slices (`:`), Ellipsis (`...`),
numpy.newaxis (`None`) and integer or boolean arrays are valid indices

Also kann ich nicht verstehen, wie ich das beheben kann. Was soll ich tun?

4
user21063

Es klingt, als hätten Sie drei Arrays itemNameList, array_x und array_y

Angenommen, sie haben alle dieselbe Form, können Sie einfach tun:

zipped = Zip(itemNameList,array_x,array_y)
li_result = list(zipped)

EDIT

Ihr Problem ist, dass array_x und array_y keine tatsächlichen numpy.array-Objekte sind, sondern numpy.int32 (oder einige andere nicht-iterierbare) Objekte:

array_x = np.int32(np.zeros(None))
array_x.shape
# ()
array_x.__iter__
# AttributeError: 'numpy.int32' object has no attribute '__iter__'

Vielleicht verläuft ihre Initialisierung nicht wie erwartet, oder sie werden von Arrays irgendwo in Ihrem Code geändert?

1
Crispin

So kann Zip (oder list (zip in py3) mehrere Listen in eine Liste von Tupeln umwandeln:

In [76]: y = ['item1', 'item2','item3']  # list of strings
In [77]: xdata = [100,200,300]         # list of numbers
In [78]: ydata = np.array([1000,2000,3000])  # equivalent array of numbers
In [79]: list(Zip(y,xdata,ydata))
Out[79]: [('item1', 100, 1000), ('item2', 200, 2000), ('item3', 300, 3000)]
0
hpaulj