1

オブジェクトの名前/IDのセットがあります(Pythonオブジェクトではなく、人生のオブジェクトに関して)。

簡単にするために、これらのオブジェクトには次の名前が付いています。

A, B, C, D, E ...

そのようなオブジェクトの数は約 2000 (将来的には約 6000 になる可能性があります)。

タスクを達成するための最良の方法を決定しようとしています:オブジェクトの各ペア間で情報 (param1、param2、...、paramN) を保存する最良の方法は何ですか。次のデータ構造のようになります。

                A               B              C              D 
A             -          [param1, param2] [param1, param2] [param1, param2]

B      [param1, param2]        -          [param1, param2] [param1, param2]

C      [param1, param2]  [param1, param2]       -          [param1, param2]

D      [param1, param2]  [param1, param2] [param1, param2]        -

いくつかの側面を考慮することが重要です。

  • cell[A,B]=cell[B,A] したがって、すべてのテーブルの 1/2 だけを保存する必要があります
  • このテーブルを tmp dir に保存し、Python アプリケーションの開始時にロードする必要があります
  • Python アプリケーションでこのテーブルから値をすばやく抽出する必要があります

私の解決策: pandas.DataFrame モジュールを使用しました。そして、各パラメーターについて: param1、param2、...個々の三角テーブルを作成します: param1table、param2table、...入力後、CSV ファイルに保存します: param1table.csv、param2table.csv、....csv

私のプログラムでは、ペアで param1 する必要がある場合: A、B、param1table.csv (pandas.read_csv) をロードし、値 [A,B] が存在するかどうかを確認し、そうでない場合は [B,A] を返す必要があります。

効率の悪い方法だと思います。

4

2 に答える 2

2

私の ML とデータ サイエンスの経験から、Python スクリプト間でデータを共有するには、CSV とHDF5という 2 つの一般的な方法があります。HDF5は整数以外の値ではうまく機能しないため、csvがほとんど問題ない場合は、できるだけ長く使用してください。

ディスク容量に問題がある場合は、データを圧縮してください。
Pandas read_csv()は、最も一般的な圧縮アルゴリズムを驚くほど理解しています。

読み込みに速度の問題がある場合は、チャンクしてから分類します。

また、データが「ミラーリング」されている場合は、単に列を名前順に並べてから、正しい方法で呼び出してみませんか? 例: call(cell[B,A]) -> call(cell[A,B]) -> cell[B,A].

追加:いくつかの極端なケースでは、各行を個別に保存し (空の部分を切り取ることを忘れないでください)、後で最も人気のある呼び出し用にある種のキャッシュ バッファーを作成することができます。

于 2016-05-16T13:07:18.810 に答える
1

に固執したい場合は、 a (ドキュメントを参照) with , asおよび, aspd.DataFrameを使用できます。オブジェクトを保存するように設計されていないため、これが望ましいでしょう。MultiIindexObject_1Object_2indexParam_1Param_2columnsDataFramelist

を使用np.triuして、現在の , の上三角を抽出しDataFrame(下三角をゼロにして返します)、 と を使用.replace(0, np.nan).stack()て長い形式に変換できます。そこから必要なのはreset_index()、 とを使用.split()するlistオブジェクトですdf.col.str.split(','), expand=True

Object_1のみを格納し、を使用せObject_2Object_2Object_1パラメータにアクセスすることを簡単に確認できますdf.loc[('Object_1', 'Object_2'), :]

.csv結果をorに保存できます。hdfこれは、行の場合は少し高速です ( docs を参照) n * (n-1) / 2

説明する:

import pandas as pd
import numpy as np
import string
from itertools import permutations

DataFrame現在使用していると思われるものに似た単純なものから始めます。

objs = [o for o in permutations(list(string.ascii_uppercase[:5]), 2)]
obj_1, obj_2 = zip(*objs)
params = [list(np.random.randint(low=0, high=10, size=2)) for j in range(len(objs))]
df = pd.DataFrame(data={'obj_1': obj_1, 'obj_2': obj_2, 'params': params})
df = df.set_index(['obj_1', 'obj_2']).unstack()

obj_2       A       B       C       D       E
obj_1                                        
A        None  [4, 7]  [7, 5]  [0, 5]  [3, 0]
B      [4, 6]    None  [0, 8]  [0, 7]  [7, 2]
C      [6, 9]  [6, 2]    None  [7, 8]  [3, 1]
D      [0, 0]  [2, 4]  [9, 8]    None  [1, 8]
E      [2, 3]  [8, 6]  [5, 7]  [5, 8]    None

が対称であると仮定してparams、下の三角形を取り除きましょう。

mask = np.ones(df.shape,dtype='bool')
mask[np.tril_indices(len(df))] = False
df = df.where(mask)

obj_2      A       B       C       D       E
obj_1                                       
A        NaN  [4, 7]  [7, 5]  [0, 5]  [3, 0]
B        NaN     NaN  [0, 8]  [0, 7]  [7, 2]
C        NaN     NaN     NaN  [7, 8]  [3, 1]
D        NaN     NaN     NaN     NaN  [1, 8]
E        NaN     NaN     NaN     NaN     NaN

次に、長い形式に変換してから抽出paramslistます。

df = df.stack()
df['param_1'], df['param_2'] = (zip(*df.params))

             params  param_1  param_2
obj_1 obj_2                          
A     B      [4, 7]        4        7
      C      [7, 5]        7        5
      D      [0, 5]        0        5
      E      [3, 0]        3        0
B     C      [0, 8]        0        8
      D      [0, 7]        0        7
      E      [7, 2]        7        2
C     D      [7, 8]        7        8
      E      [3, 1]        3        1
D     E      [1, 8]        1        8

paramsしたがって、もう必要ありません。

df.drop('params', axis=1, inplace=True)

そして、次のようにアクセスできるようになりました:

df.loc[('B', 'C')]

param_1    0
param_2    8

または個別に:

df.loc[('B', 'C'), 'param_1']

0
于 2016-05-16T13:04:44.623 に答える