2013-07-23 3 views
2

numpy 배열에 대한 액세스를 제공하는 장고 모델이 있습니다.np.array 인덱스를 함수에 전달

나는 두 개의 인수를 받아들이는 발전기 만들려면 : 난 그냥 언급 한 모델의

  1. 의 검색어를하고
  2. NumPy와 배열 슬라이스/인덱스 구문

이 발전기해야 Queryset을 반복하고 Queryset의 각 모델 인스턴스와 관련된 배열을 찾습니다. 항상 전체 배열을 산출하는 대신, 검색하고자하는 슬라이스를 지정할 수 있어야합니다.

문자열을 전달하고 eval (문자열)을 사용하여이 작업을 시도했지만 콜론을 사용하지 않았습니다.

numpy_array[eval("0,0")] 

을하지만이되지 않습니다 :

예를 들어,이 작품

numpy_array[eval(":")] 

은 사람이 할 수있는 방법을 생각할 수 있는가?

답변

4

참고 : 장고를 알지 못합니다. 장고 모델에만 문자열을 전달할 수 있다고 가정합니다.

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

참고 : 2 차원 배열이있는 경우, 당신도 조각의 캐릭터 라인 튜플 전달할 수,

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

나 :


당신은 문자열 "slice(...)"을 평가 후면 수 그러나 문자열이 사용자 입력에서 오는 경우 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]])