9

numpy を使用して長さ 100 の辺を持つキューブ配列を作成しているため、合計 100 万のエントリが含まれています。100 万個のエントリのそれぞれに、ランダムに生成された数値で構成されるエントリを持つ 100x100 のマトリックスを挿入しています。そのために次のコードを使用しています。

import random
from numpy import *

cube = arange(1000000).reshape(100,100,100)

for element in cube.flat:
    matrix = arange(10000).reshape(100,100)
    for entry in matrix.flat:
        entry = random.random()*100
    element = matrix

これにはしばらく時間がかかると予想していましたが、100 億個の乱数が生成されているため、私のコンピューターで処理できるかどうかさえわかりません。そのような配列はどのくらいのメモリを占有しますか? RAM が制限要因になるでしょうか。つまり、コンピュータに十分な RAM がない場合、配列を実際に生成できない可能性がありますか?

また、このコードを実装するためのより効率的な方法があれば、ヒントをいただければ幸いです:)

4

2 に答える 2

23

いくつかのポイント:

  • numpy 配列のメモリ内のサイズは簡単に計算できます。これは単純に、要素数にデータ サイズを掛けたものに、一定の小さなオーバーヘッドを加えたものです。たとえば、cube.dtypeがで、1,000,000 個の要素がある場合、バイト (8Mb)int64が必要になります。1000000 * 64 / 8 = 8,000,000
  • ただし、@Gabe が指摘しているように、100 * 100 * 1,000,000 double には約80 Gbが必要です。
  • これ自体は何も「壊れる」ことはありませんが、コンピュータを交換する必要があるため、操作が非常に遅くなります。
  • あなたのループはあなたが期待することをしません。の要素を置き換える代わりにcube、変数element = matrixを単純に上書きし、変更しないままにします。についても同様です。elementcubeentry = random.rand() * 100
  • 代わりに、http: //docs.scipy.org/doc/numpy/reference/arrays.nditer.html#modifying-array-valuesを参照してください。
于 2012-06-28T21:59:51.710 に答える
2

関数の「内部」部分については、numpy.randomモジュールをご覧ください。

import numpy as np
matrix = np.random.random((100,100))*100
于 2012-06-28T22:39:12.017 に答える