我想創建一個從真正巨大的列表SciPy的陣列。但不幸的是,我偶然發現了一個問題。真的創造巨大SciPy的陣列
我有一個列表XS,字符串。每個字符串的長度爲。
>>> type(xs)
<type 'list'>
>>> len(xs)
4001844816
如果我只轉換第一元素,一切仍然正常工作。
>>> 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 是最小尺寸造成問題的原因。 我這個小腳本判定:
#!/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'
對不起,不由自主,因爲無法複製。你能找出導致錯誤的最小'xs'子集大小嗎? – alko
@alko:我添加信息質疑 – yapphdorlw
由於2147483648 = 2 ** 31,我很舒爾這是內存分配/在SciPy的adressation限制,可能是由於簽署了INT32使用。我建議scipy [問題跟蹤]解決這個錯誤(http://www.scipy.org/scipylib/bug-report.html) – alko