質問

合理的にスペース効率的な使用とするのは簡単ですいくつかの方法で、

私は大行列(250x250x30 = 1875000細胞)で働いている、と私は、この行列の各セルのためのフラグの任意の数を設定する方法が欲しいですます。

["FLAG1","FLAG8","FLAG12"]

私の当初の計画では、各要素のようなものだった250x250x30リスト配列でした。 [1,8,12]を:私は、だけではなく、整数を格納し、それを変更しました。これらの整数は、元のフラグ文字列にゲッター/セッター機能によって内部マッピングされます。これは、メモリの点で微細である、ポイント当たり8つのフラグで250メガバイトを使用します。

私の質問は:私はこの種のデータを構造化する別の明白な方法をしないのです。

? すべてのご提案のための

ありがとう。私は、悲しいことに、私は一つだけ答えを選んで、他の人をupvotingと一緒に暮らすことができ、一つにいくつかの提案を転がり終わっます:

編集:私は(3D numpyのアレイの基本要素としてセットを使用して)ここであった多くのメモリを使用する最初のコードをERM。 randint(0,2**1000)で満たされたときに、この新しいバージョンでは、500メガバイトの周りに使用します。

import numpy

FLAG1=2**0
FLAG2=2**1
FLAG3=2**2
FLAG4=2**3

(x,y,z) = (250,250,30)

array = numpy.zeros((x,y,z), dtype=object)


def setFlag(location,flag):
    array[location] |= flag
def unsetFlag(location,flag):
    array[location] &= ~flag
役に立ちましたか?

解決

Iは、一般的に、おそらく短いintのhref="http://numpy.scipy.org/" rel="nofollow noreferrer"> numpyののアレイ(各2バイト、あなたが得るので

私は(numpyのをサポートしていないのApp Engine、上など)numpyの依存関係を余裕がなかった何らかの理由で、私は標準ライブラリ<のhref = "http://docs.python.orgを使用したい場合/library/array.html」のrel = 『nofollowをnoreferrer』>配列のモジュール - あなたはそれが唯一の1次元配列をサポートしていますが、それは大きな均質な配列のためのnumpyのと同じくらいスペース効率だし、ゲッター/セッター・ルーチンそれは、1-D配列に単一の整数インデックスにあなたの自然な指標だタプル言及は完全によく3項目を「線形化」することができます。

一般的には、numpyの考慮(または配列)あなたが大規模な均質、高密度のベクトルまたは数字の行列を持つ任意の時間 - Pythonの組み込みのリストが原因あなたがしている彼らの一般に(このユースケース内のスペースの非常に無駄です使用していないと、ここでは必要ありません! - 。)、およびメモリを節約することは、間接的に(より良いキャッシング、間接の少ないレベル、などなど)あまりにも時間を節約に変換

他のヒント

すべての単一のセルが旗を持っているとしている場合は、

あなたのソリューションは、罰金です。しかし、あなたはあなたの細胞の唯一の小さなサブセクションは、あなたが本当に辞書で何をしたいのフラグを持つことになりますまばらなデータセットで作業している場合。キーは、セルの位置のためのタプルであり、あなたがあなたのソリューションを持っているように値がフラグのリストであるので、あなたはdictonaryを設定するとよいでしょう。

allFlags = {(1,1,1):[1,2,3], (250,250,30):[4,5,6]}

ここでは、1,1,1セルを持っているフラグ1,2、および3を持っていると、セル250,250,30は、フラグ4,5を持ち、そして6

編集 - キータプル、感謝アンドレ、および辞書の構文を固定します。

あなたはのように2つの値の異なる、パワーといくつかの定数を定義することができます:

FLAG1 = 0x01
FLAG8 = 0x02
FLAG12 = 0x04
...

そして唯一の整数、p.eのフラグを格納するブール論理でそれらを使用します。

flags = FLAG1 | FLAG8

フラグが有効になっているかどうかを確認するには、&演算子を使用することができます:

flag1_enabled = flags & FLAG1
フラグが有効になっている場合は、

、この式は、任意のブール演算で真と評価される非ゼロ値を返します。フラグが無効になっている場合、式は0を返します、それはブール演算で偽と評価されます。

セルのプロパティを共有するためにFlyweightパターンの使用を検討します:

http://en.wikipedia.org/wiki/Flyweight_patternする

たBitSet のは、それはあなたが一度使用した時に、多くのフラグを格納することができますので、あなたは、何をしたいです唯一の固定サイズの整数(INT型)

さらに一歩ロビーの提案を撮影...

flags = set()
x, y, flag = 34, 201, 3
flags.add((x, y, flag)) # set flag 3 at position (34, 201)
if (3, 2, 1) in flags: # check if flag 1 is at position (3, 2)
    # do something
else:
    # do something else

また、ヘルパークラスを作成することができます。

class Flags(object):
    def __init__(self):
        self.data = set()
    def add(self, x, y, flag):
        self.data.add((x, y, flag))
    def remove(self, x, y, flag):
        self.data.remove((x, y, flag))
    def contains(self, x, y, flag):
        return (x, y, flag) in self.data

また、それが簡単で動作するようにするために__contains__のようなPythonの特別なメソッドを実装することができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top