2010-09-15 9 views
2

J'utilise NumPy avec Python 2.6.2. J'essaye de créer un petit tableau booléen simple (longueur 3). Ce qui suit me donne un MemoryError, que je pense qu'il ne devrait pas.Erreur de mémoire (MemoryError) lors de la création d'un tableau numpy booléenne (Python)

import numpy as np 
cond = np.fromiter((x in [2] for x in [0, 1, 2]), dtype = np.bool) 

L'erreur qu'il me donne est:

MemoryError: ne peut pas allouer de la mémoire de tableau

Cependant, la méthode suivante d'obtenir une liste (par opposition à un ndarray) fonctionne très bien (sans utiliser numpy):

cond = list((x in [2] for x in [0, 1, 2])) 

Ai-je fait quelque chose de mal dans le code Numpy? Mon sentiment est que cela devrait fonctionner.

+1

Votre premier code fonctionne pour moi comme il est. Pouvez-vous poster les versions de Python et Numpy? –

+0

Pour ce que ça vaut, je peux reproduire le problème en utilisant python 2.5 et numpy 1.1, mais pas avec quelque chose de plus récent. Sur les anciennes versions, cela fonctionne bien si vous spécifiez manuellement le 'count' kwarg (' count = 3', dans ce cas). Cependant, cela va à l'encontre de l'objectif d'utiliser 'np.fromiter' en premier lieu. Je suppose que c'est un bug en numpy qui a été corrigé entre 1.1 et 1.5? –

Répondre

1

Je peux reproduire le problème avec numpy 1.1 (mais pas avec quoi que ce soit plus récent). Évidemment, la mise à niveau vers une version plus récente de numpy est votre meilleur pari. Néanmoins, il semble être lié à l'utilisation de np.bool comme dtype lorsque count=-1 (la valeur par défaut: Lire tous les éléments dans l'itérateur, au lieu d'un nombre défini).

Une solution rapide est juste de créer comme un tableau int, puis le convertir en un tableau booléen:

cond = np.fromiter((x in [2] for x in [0, 1, 2]), dtype=np.int).astype(np.bool) 

Une alternative est de le convertir en une liste, puis définissez count à la longueur la liste (ou simplement utiliser np.asarray sur la liste):

items = list((x in [2] for x in [0, 1, 2])) 
cond = np.fromiter(items, dtype=np.bool, count=len(items)) 

de toute évidence, ces deux sont suboptimale, mais si vous ne pouvez pas passer à une version plus récente de numpy, ils travailleront.

+0

+1: bonne solution de contournement. – EOL

+0

Merci! J'ai suspecté que c'était une bogue/version. – Underflow

1

Vous ne devriez recevoir aucune erreur.

Avec Python 2.6.5 ou Python 2.7 et 1.5.0 Numpy, je ne suis pas d'erreur. Je pense donc que la mise à jour de votre logiciel pourrait très bien résoudre le problème que vous observez.

+0

Merci! Je ne peux pas obtenir une nouvelle version de numpy pour le moment, je vais donc contourner le problème. – Underflow