web-dev-qa-db-fra.com

TypeError: seuls les tableaux d'entiers avec un élément peuvent être convertis en index 3

J'ai cette erreur dans le titre et je ne sais pas ce qui ne va pas. Cela fonctionne lorsque j'utilise np.hstack au lieu de np.append, mais j'aimerais accélérer les choses, utilisez donc append.

time_list une liste de floats

heights est un tableau 1p np.array de flotteurs

j = 0
n = 30
time_interval = 1200
axe_x = []

while j < np.size(time_list,0)-time_interval:
    if (not np.isnan(heights[j])) and (not np.isnan(heights[j+time_interval])):
        axe_x.append(time_list[np.arange(j+n,j+(time_interval-n))])

 File "....", line .., in <module>
    axe_x.append(time_list[np.arange(j+n,j+(time_interval-n))])

TypeError: only integer arrays with one element can be converted to an index
25
GeoffreyB

Le problème est juste comme l'erreur l'indique, time_list Est une liste normale python, et vous ne pouvez donc pas l'indexer en utilisant une autre liste (à moins que l'autre liste ne soit un tableau avec un seul élément ). Exemple -

In [136]: time_list = [1,2,3,4,5,6,7,8,9,10,11,12,13,14]

In [137]: time_list[np.arange(5,6)]
Out[137]: 6

In [138]: time_list[np.arange(5,7)]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-138-ea5b650a8877> in <module>()
----> 1 time_list[np.arange(5,7)]

TypeError: only integer arrays with one element can be converted to an index

Si vous voulez faire ce genre d’indexation, vous devez faire de time_list Un numpy.array. Exemple -

In [141]: time_list = np.array(time_list)

In [142]: time_list[np.arange(5,6)]
Out[142]: array([6])

In [143]: time_list[np.arange(5,7)]
Out[143]: array([6, 7])

Une autre chose à noter serait que dans votre boucle while, vous n'augmentez jamais j, de sorte qu'il peut se terminer avec une boucle infinie, vous devriez également augmenter j d'un certain montant (peut-être time_interval?).


Mais selon l'exigence que vous avez posté dans les commentaires -

axe_x devrait être un tableau 1d de floats généré à partir de la liste time_list

Vous devez utiliser .extend() au lieu de .append(), .append Créerait une liste de tableaux pour vous. Mais si vous avez besoin d'un tableau 1D, vous devez utiliser .extend(). Exemple -

time_list = np.array(time_list)
while j < np.size(time_list,0)-time_interval:
    if (not np.isnan(heights[j])) and (not np.isnan(heights[j+time_interval])):
        axe_x.extend(time_list[np.arange(j+n,j+(time_interval-n))])
        j += time_interval           #Or what you want to increase it by.
39
Anand S Kumar