Hoe kan ik voorkomen dat de TypeError: Lijstindices moeten gehele getallen zijn, niet tuple bij het kopiëren van een Python-lijst naar een Numpy-array?

Ik probeer 3 numpy arrays / lijsten te maken met behulp van gegevens van een andere array genaamd Mean_Data als volgt:

---> 39 R = np.array(mean_data[:,0])
     40 P = np.array(mean_data[:,1])
     41 Z = np.array(mean_data[:,2])

Wanneer ik probeer het programma uit te voeren, krijg ik de foutmelding:

TypeError: list indices must be integers, not tuple

De gemiddelde modellenlijst ziet eruit als deze sample …

[6.0, 315.0, 4.8123788544375692e-06],
[6.5, 0.0, 2.259217450023793e-06],
[6.5, 45.0, 9.2823565008402673e-06],
[6.5, 90.0, 8.309270169336028e-06],
[6.5, 135.0, 6.4709418114245381e-05],
[6.5, 180.0, 1.7227922423558414e-05],
[6.5, 225.0, 1.2308522579848724e-05],
[6.5, 270.0, 2.6905672894824344e-05],
[6.5, 315.0, 2.2727114437176048e-05]]

Ik weet niet hoe ik deze fout moet voorkomen, ik heb geprobeerd gemiddelde naam te maken als een NP.Array en het gebruik van NP.Anthende om waarden aan te voegen, maar dat is ook niet het probleem op.

Hier is de traceback (gebruikte IPYTHON eerder)

Traceback (most recent call last):
  File "polarplot.py", line 36, in <module>
    R = np.array(mean_data[:,0])
TypeError: list indices must be integers, not tuple

En de andere manier die ik heb geprobeerd om een ​​array te maken was:

mean_data = np.array([])
for ur, ua in it.product(uradius, uangle):
    samepoints = (data[:,0]==ur) & (data[:,1]==ua)
    if samepoints.sum() > 1:  # check if there is more than one match
        np.append(mean_data[ur, ua, np.mean(data[samepoints,-1])])
    elif samepoints.sum() == 1:
        np.append(mean_data, [ur, ua, data[samepoints,-1]])

De traceback daarvan is:

IndexError                                Traceback (most recent call last)
<ipython-input-3-5268bc25e75e> in <module>()
     31     samepoints = (data[:,0]==ur) & (data[:,1]==ua)
     32     if samepoints.sum() > 1:  # check if there is more than one match
---> 33         np.append(mean_data[ur, ua, np.mean(data[samepoints,-1])])
     34     elif samepoints.sum() == 1:
     35         np.append(mean_data, [ur, ua, data[samepoints,-1]])
IndexError: invalid index

Antwoord 1, autoriteit 100%

De variabele mean_datais een geneste lijst, in Python kan toegang tot een geneste lijst niet worden gedaan door multidimensionale slicing, dwz: mean_data[1,2], in plaats daarvan men zou mean_data[1][2]schrijven.

Dit komt omdatmean_data[2]een lijst is. Verder indexeren gebeurt recursief – aangezien mean_data[2]een lijst is, is mean_data[2][0]de eerste index van die lijst.

Bovendien werkt mean_data[:][0]niet omdat mean_data[:]mean_dataretourneert.

De oplossing is om de array te vervangen of de originele gegevens als volgt te importeren:

mean_data = np.array(mean_data)

numpy-arrays (zoals MATLAB-arrays en in tegenstelling tot geneste lijsten) ondersteunen multidimensionale slicing met tupels.


Antwoord 2, autoriteit 22%

U hoeft waarschijnlijk geen lijsten te maken en ze toe te voegen om uw array te maken. Je kunt het waarschijnlijk allemaal tegelijk doen, wat sneller is omdat je numpy kunt gebruiken om je loops te doen in plaats van ze zelf te doen in pure python.

Om uw vraag te beantwoorden, zoals anderen al hebben gezegd, kunt u geen toegang krijgen tot een geneste lijst met twee indices zoals u deed. U kunt als u mean_dataconverteert naar een array voordat u deze probeert te slicen:

R = np.array(mean_data)[:,0]

in plaats van

R = np.array(mean_data[:,0])

Maar, ervan uitgaande dat mean_data een vorm heeft nx3, in plaats van

R = np.array(mean_data)[:,0]
P = np.array(mean_data)[:,1]
Z = np.array(mean_data)[:,2]

Je kunt het gewoon doen

A = np.array(mean_data).mean(axis=0)

die het gemiddelde neemt over de 0de as en een array lengte-nretourneert

Maar om mijn oorspronkelijke punt te maken, ik zal wat gegevens verzinnen om te proberen te illustreren hoe je dit kunt doen zonder één item tegelijk op te bouwen:


Antwoord 3, autoriteit 9%

import numpy as np
mean_data = np.array([
[6.0, 315.0, 4.8123788544375692e-06],
[6.5, 0.0, 2.259217450023793e-06],
[6.5, 45.0, 9.2823565008402673e-06],
[6.5, 90.0, 8.309270169336028e-06],
[6.5, 135.0, 6.4709418114245381e-05],
[6.5, 180.0, 1.7227922423558414e-05],
[6.5, 225.0, 1.2308522579848724e-05],
[6.5, 270.0, 2.6905672894824344e-05],
[6.5, 315.0, 2.2727114437176048e-05]])
R = mean_data[:,0]
print R
print R.shape

BEWERKEN

De reden waarom u een invalid index-fout kreeg, is het ontbreken van een komma tussen mean_dataen de waarden die u wilde toevoegen.

Ook np.append retourneert een kopie van de array en verandert de oorspronkelijke array niet. Uit de documentatie:

Retouren: append: ndarray

Een kopie van arr met waarden toegevoegd aan de as. Merk op dat append niet ter plaatse voorkomt: er wordt een nieuwe array toegewezen en gevuld. Als as Geen is, is uit een afgeplatte matrix.

Dus je moet het resultaat np.appendtoewijzen aan een array (kan mean_datazelf zijn, denk ik), en, aangezien u geen afgeplatte array wilt, moet u ook de as specificeren waarop u wilt toevoegen.

Met dat in gedachten, denk ik dat je zoiets zou kunnen proberen

mean_data = np.append(mean_data, [[ur, ua, np.mean(data[samepoints,-1])]], axis=0)

Kijk eens naar de dubbele [[en ]]: ik denk dat ze nodig zijn omdat beide arrays dezelfde vorm moeten hebben.


Antwoord 4, autoriteit 3%

np.append heeft de array nodig als het eerste argument en de lijst die u wilt toevoegen als het tweede:

mean_data = np.append(mean_data, [ur, ua, np.mean(data[samepoints,-1])])

Antwoord 5, autoriteit 3%

Als iemand dit probleem heeft en list[index, sub-index]niet heeft gedaan, zou je het probleem kunnen hebben omdat je een komma mist tussen twee arrays in een array van arrays (het overkwam mij).


Antwoord 6

Serieus, dit kostte me veel kostbare tijd, maar ik heb geen oplossing gevonden.
Als u gegevens uit sql haalt, converteert u in principe deze stappen.

rows = cursor.fetchall()---- only tried on single column
dataset=[]
for x in rows:
    dataset.append(float(x[0]))

Other episodes