2017-02-07 3 views
3

numpy meshgridを使用して非常に大きなグリッドを作成する必要があります。私はメッシュをしようとしている配列のための私のdtypeとしてint8を使用してメモリを節約するために。しかし、meshgridは型をint64に変更し続け、これは大量のメモリを使用します。ここでは、問題の簡単な例です...numpy meshgridがデフォルトのデータ型をint64に設定しないようにするには

import numpy 

grids = [numpy.arange(1, 4, dtype=numpy.int8), numpy.arange(1, 5, dtype=numpy.int8)] 

print grids 
print grids[0].dtype, grids[0].nbytes 

x1, y1 = numpy.meshgrid(*grids) 

print x1.dtype, x1.nbytes 

このスクリプトは

[array([1, 2, 3], dtype=int8), array([1, 2, 3, 4], dtype=int8)] 

int8 3 

int64 96 

なぜ関数meshgridは、これを行うんを出力しますか?それを止める方法はありますか?私は巨大な配列を作成する必要がありますので、出力のデータ型を制御できない限り、meshgridを使用することはできません。これは意図された動作か、それとも気になるバグですか? numpyで使用した関数はすべて、データ型を保持するか、dtype引数を使用して変更することができます。 meshgrid関数はこれを可能にしていません。

答えて

3

あなたは(それはいくつかの制約があること、しかし、注意を)Falsenumpy.meshgrid()のオプションcopyパラメータを設定することができます

meshgrid(*xi, **kwargs)

...

copybool、オプション

Falseの場合、元の メモリを節約するために返されます。デフォルトはTrueです。 sparse=False, copy=Falseは、不連続な配列を返す可能性が高いことに注意してください。さらに、ブロードキャストアレイの複数の要素は、単一の メモリ位置を参照することができる。 。配列に書き込む必要がある場合は、最初にコピー を作成します。

それが動作することを証明:

>>> import numpy 
>>> 
>>> grids = [numpy.arange(1, 4, dtype=numpy.int8), numpy.arange(1, 5, dtype=numpy.int8)] 
>>> 
>>> print grids 
[array([1, 2, 3], dtype=int8), array([1, 2, 3, 4], dtype=int8)] 
>>> print grids[0].dtype, grids[0].nbytes 
int8 3 
>>> 
>>> x1, y1 = numpy.meshgrid(*grids, copy=False) 
>>>      #  ^^^^^^^^^^ 
>>> print x1.dtype, x1.nbytes 
int8 12 
+0

'numpy.indices'を使用することもできる、とは' dtype'パラメータがあります。 – Benjamin

+0

それは素晴らしい作品です!ちょうど私が探していたもの。 – b10hazard

関連する問題