>

중간 적으로 중첩 된 배열로 논리적으로 가장 좋은 코드가 있습니다. 전체 구조는 크기가 작고 드문 경우이므로 드문 구현에 필요한 2d 매트릭스로 변환해야 메모리에 맞습니다.

이제 복잡하고 혼동되는 두 가지 형식 사이에서 정신적으로 전환하는 것을 발견했습니다. 중첩 된 입력에서 2d 셀을 계산하는 작은 함수를 작성했지만 범위 쿼리를 수행하려면 훨씬 복잡해집니다.

import numpy as np
dim1 = 1
dim2 = 2
dim3 = 3
dim4 = 4 
dim5 = 5
dim6 = 6
sixD = np.arange(720).reshape(dim1, dim2, dim3, dim4, dim5, dim6)
twoD = sixD.transpose(0,1,2,3,4,5).reshape(dim1,-1)
def sixDto2DCell(a, b, c, d, e, f):
  return [a, (b*dim3*dim4*dim5*dim6) + 
    (c*dim4*dim5*dim6) + 
    (d*dim5*dim6) + 
    (e*dim6) + 
    f]
x, y = sixDto2DCell(0, 1, 2, 3, 4, 5)
assert(sixD[0, 1, 2, 3, 4, 5] == twoD[x, y])

따라서 쿼리와 같은 작업을 수행하려고합니다

sixD[0, 1, 0:, 3, 4, 5]

2 차원 행렬에서 동일한 값을 반환하려면

새로운 함수를 작성해야합니까, 아니면 같은 것을 달성하는 내장 된 방법을 놓쳤습니까?

어떤 도움이라도 대단히 감사하겠습니다 :-)

  • 답변 # 1

    접근법 # 1

    다음은 대응하는 n 차원 배열과 각 축을 따라 시작 및 끝 인덱스가있는 문제에 대해 2D 희소 행렬 또는 2D 배열에서 데이터를 일반적으로 추출하는 한 가지 방법입니다.

    def sparse_ndim_map_indices(ndim_shape, start_index, end_index):       
        """
        Get flattened indices for indexing into a sparse array mapped to
        a corresponding n-dim array.
        """        
        # Get shape and cumulative shape info for use to get flattened indices later
        shp = ndim_shape
        cshp = np.r_[np.cumprod(shp[::-1])[::-1][1:],1]
        # Create open-ranges
        o_r = np.ix_(*[s*np.arange(i,j) for (s,i,j) in zip(cshp,start_index,end_index)])
        id_ar = np.zeros(np.array(end_index) - np.array(start_index), dtype=int)
        for r in o_r:
            id_ar += r
        return id_ar
    
    

    샘플 사례 실행 연구를 위해 제공된 샘플 사용-

    In [637]: start_index = (0,1,1,1,4,3)
         ...: end_index =   (1,2,3,4,5,6)
         ...: 
         ...: out1 = sixD[0:1, 1:2, 1:3, 1:4, 4:5, 3:6]
    In [638]: out1
    Out[638]: 
    array([[[[[[537, 538, 539]],
              [[567, 568, 569]],
              [[597, 598, 599]]],
    
             [[[657, 658, 659]],
              [[687, 688, 689]],
              [[717, 718, 719]]]]]])
    In [641]: idx = sparse_ndim_map_indices(sixD.shape, start_index, end_index)
    In [642]: twoD[:,idx.ravel()]
    Out[642]: 
    array([[537, 538, 539, 567, 568, 569, 597, 598, 599, 657, 658, 659, 687,
            688, 689, 717, 718, 719]])
    
    

    접근법 # 2

    각 축을 따라 모든 인덱스 조합을 만든 다음 np.ravel_multi_index 를 사용하는 또 다른 방법은 다음과 같습니다.  납작한 지수를 얻는 방법-

    import itertools
    def sparse_ndim_map_indices_v2(ndim_shape, start_index, end_index):    
        # Create ranges and hence get the flattened indices
        r = [np.arange(i,j) for (i,j) in zip(start_index,end_index)]
        return np.ravel_multi_index(np.array(list(itertools.product(*r))).T, ndim_shape)
    
    

  • 이전 신속하게 문자열 정수에 쉼표를 추가하십시오
  • 다음 python - Tensorflow 확장 파이프 라인이있는 TF- 라이트 컨버터 (시카고 택시 파이프 라인 예)