本当に巨大なリストから 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.
パイソンのバージョンは
>>> 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'