将np.array索引传递给函数

时间:2013-07-23 16:35:59

标签: python django-models numpy generator

我有一个Django模型,可以访问numpy数组。

我想创建一个接受两个参数的生成器:

  1. 我刚刚提到的模型的查询集,
  2. numpy数组切片/索引语法
  3. 此生成器应遍历Queryset并生成与Queryset中的每个模型实例关联的numpy数组。我希望能够指定我想要检索的切片,而不必总是产生完整的numpy数组。

    我尝试通过传入一个字符串,然后使用eval(string)来做到这一点,但它不喜欢冒号。

    例如,这有效:

    numpy_array[eval("0,0")]
    

    但这不是:

    numpy_array[eval(":")]
    

    有人能想到办法吗?

1 个答案:

答案 0 :(得分: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 is inherently unsafe如果字符串来自用户输入。


这是一种更安全的方法:传递一个字符串化的元组列表。每个元组代表一个切片:

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]])