2

numpy 配列へのアクセスを提供する Django モデルがあります。

2 つの引数を受け入れるジェネレーターを作成したい:

  1. 先ほど言及したモデルのクエリセット、および
  2. numpy 配列のスライス/インデックス構文

このジェネレーターは、Queryset を反復処理し、Queryset 内の各モデル インスタンスに関連付けられた numpy 配列を生成する必要があります。numpy 配列全体を常に生成する必要があるのではなく、取得するスライスを指定できるようにしたいと考えています。

文字列を渡してから eval(string) を使用してこれを実行しようとしましたが、コロンが好きではありません。

たとえば、これは機能します:

numpy_array[eval("0,0")]

しかし、これはしません:

numpy_array[eval(":")]

誰でもこれを行う方法を考えることができますか?

4

1 に答える 1

4

注: 私は Django を知りません。Django モデルには文字列のみを渡すことができると想定しています。


文字列を評価できます"slice(...)"

In [101]: arr = np.random.random((100,))

In [102]: arr[eval("slice(6,10)")]
Out[102]: array([ 0.60968632,  0.17116998,  0.24861622,  0.37071511])

または、2D 配列がある場合は、文字列化されたスライスのタプルを渡すこともできます。

In [105]: arr = arr.reshape(10,10)    

In [107]: arr[eval("slice(6,10), slice(2,5)")]
Out[107]: 
array([[ 0.23903737,  0.07691556,  0.08544998],
       [ 0.79273288,  0.73710837,  0.11193991],
       [ 0.65617212,  0.53528755,  0.53514291],
       [ 0.01626145,  0.59864093,  0.71240672]])

ただし、文字列がユーザー入力によるものである場合、これevalは本質的に安全ではないことに注意してください。


より安全な方法は次のとおりです。文字列化されたタプルのリストを渡します。各タプルはスライスを表します:

In [108]: import ast
In [109]: ast.literal_eval("[(6,10), (2,5)]")
Out[109]: [(6, 10), (2, 5)]
In [110]: [slice(*item) for item in ast.literal_eval("[(6,10), (2,5)]")]
Out[110]: [slice(6, 10, None), slice(2, 5, None)]

In [111]: arr[[slice(*item) for item in ast.literal_eval("[(6,10), (2,5)]")]]
Out[111]: 
array([[ 0.23903737,  0.07691556,  0.08544998],
       [ 0.79273288,  0.73710837,  0.11193991],
       [ 0.65617212,  0.53528755,  0.53514291],
       [ 0.01626145,  0.59864093,  0.71240672]])

In [113]: arr[[slice(*item) for item in ast.literal_eval("[(0,1), (0,1)]")]]
Out[113]: array([[ 0.77409234]])
于 2013-07-23T16:38:36.000 に答える