我想从一个非常大的列表中创建一个 scipy 数组。但不幸的是,我偶然发现了一个问题。
我有一个字符串列表xs。每个字符串的长度为1。
>>> type(xs)
<type 'list'>
>>> len(xs)
4001844816
如果我只转换前10 个元素,一切仍然按预期工作。
>>> s = xs[0:10]
>>> x = scipy.array(s)
>>> x
array(['A', 'B', 'C', 'D', 'E', 'F', 'O', 'O'],
dtype='|S1‘)
>>> len(x)
10
对于整个列表,我得到以下结果:
>>> ary = scipy.array(xs)
>>> ary.size
1
>>> ary.shape
()
>>> ary[0]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: 0-d arrays can't be indexed
>>>ary[()]
...The long list
一种解决方法是:
test = scipy.zeros(len(xs), dtype=(str, 1))
for i in xrange(len(xs)):
test[i] = xs[i]
不是内存不足的问题。到目前为止,我将使用解决方法(需要 15 分钟)。但我想了解这个问题。
谢谢
- 编辑:解决方法的备注test[:] = xs
将不起作用。(也因0-d IndexError而失败)
在我的 macbook上, 2147483648是导致问题的最小尺寸。我用这个小脚本确定了它:
#!/usr/bin/python
import scipy as sp
startlen = 2147844816
xs = ["A"] * startlen
ary = sp.array(xs)
while ary.shape == ():
print "bad", len(xs)
xs.pop()
ary = sp.array(xs)
print "good", len(xs)
print ary.shape, ary[0:10]
print "DONE."
这是输出
...
bad 2147483649
bad 2147483648
good 2147483647
(2147483647,) ['A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A' 'A']
DONE.
python版本是
>>> sys.version
'2.7.5 (default, Aug 25 2013, 00:04:04) \n[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)]'
>>> scipy.version.version
'0.11.0'