4

本当に巨大なリストから 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'
4

1 に答える 1