2010-09-15 108 views
2

我在Python 2.6.2中使用NumPy。我试图创建一个小的(长度为3),简单的布尔数组。以下给我一个MemoryError,我认为它不应该。创建布尔型NumPy数组(Python)时出现内存错误(MemoryError)

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

它给我的错误是:

的MemoryError:不能分配阵列存储器

然而,获得的列表(而不是一个ndarray)的下述方法工作正常(不使用numpy的):

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

我在Numpy代码中做了什么错误吗?我的感觉是它应该工作。

+1

你的第一个代码适合我。你能发布Python和Numpy的版本吗? – 2010-09-15 12:13:31

+0

对于它的价值,我可以使用python 2.5和numpy 1.1来重现问题,但不能与任何新的更新。在旧版本中,如果您手动指定'count' kwarg(在本例中为'count = 3'),则工作正常。但是,这首先破坏了使用'np.fromiter'的目的。我认为这是一个在1.1到1.5之间的固定值的bug。 – 2010-09-15 13:32:09

回答

1

我可以重现与numpy 1.1(但不是更新的任何东西)的问题。显然,升级到更新版本的numpy是你最好的选择。

尽管如此,它似乎与使用np.bool作为dtype时count=-1(默认:读取迭代器中的所有项目而不是集合号码)有关。

快速的解决方法是只将其创建为一个int数组,然后将其转换为一个布尔数组:

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

另一种方法是将其转换为一个列表,然后设置count到的长度列表(或只是名单上使用np.asarray):

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

显然,这两种都是不理想的,但如果你不能升级到最新版本numpy的,他们会工作。

+0

+1:很好的解决方法。 – EOL 2010-09-15 13:58:15

+0

谢谢!我确实怀疑这是一个错误/版本的东西。 – Underflow 2010-09-20 12:59:31

1

你不应该得到任何错误。

随着Python 2.6.5或Python 2.7和Numpy 1.5.0,我没有得到任何错误。因此,我认为更新软件可以很好地解决您观察到的问题。

+0

谢谢!我现在无法获得新版本的numpy,所以我只会解决它。 – Underflow 2010-09-20 13:00:46

相关问题