【问题标题】:Passing np.array indexes into functions将 np.array 索引传递给函数
【发布时间】:2013-07-23 16:35:59
【问题描述】:

我有一个 Django 模型,它提供对 numpy 数组的访问。

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

  1. 我刚才提到的模型的查询集,并且
  2. numpy 数组切片/索引语法

这个生成器应该遍历 Queryset 并产生与 Queryset 中每个模型实例关联的 numpy 数组。我希望能够指定我想要检索的切片,而不是总是产生完整的 numpy 数组。

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

例如,这是有效的:

numpy_array[eval("0,0")]

但事实并非如此:

numpy_array[eval(":")]

有人能想出办法吗?

【问题讨论】:

    标签: python django-models numpy generator


    【解决方案1】:

    注意:我不了解 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])
    

    或者,如果你有一个二维数组,你甚至可以传递一个字符串化的切片元组:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-13
      • 1970-01-01
      • 1970-01-01
      • 2022-08-12
      相关资源
      最近更新 更多