IT story

언제 hstack / vstack vs append vs concatenate vs column_stack을 사용해야합니까?

hot-time 2020. 12. 31. 22:56
반응형

언제 hstack / vstack vs append vs concatenate vs column_stack을 사용해야합니까?


간단한 질문 : 이러한 각 방법의 장점은 무엇입니까? 올바른 매개 변수 (및 ndarray 모양)가 주어지면 모두 동일하게 작동하는 것 같습니다. 일부는 제자리에서 작동합니까? 더 나은 성능이 있습니까? 언제 어떤 기능을 사용해야합니까?


이러한 기능의 코드에 액세스 할 수 있습니까? 모두 Python으로 작성되었습니다 np.concatenate. IPython 셸에서는 ??.

그렇지 않다면 다음은 코드 요약입니다.

vstack
concatenate([atleast_2d(_m) for _m in tup], 0)
i.e. turn all imputs in to 2d (or more) and concatenate on first

hstack
concatenate([atleast_1d(_m) for _m in tup], axis=<0 or 1>)

colstack
transform arrays with (if needed)
    array(arr, copy=False, subok=True, ndmin=2).T

append
concatenate((asarray(arr), values), axis=axis)

즉, 이들은 모두 입력 배열의 차원을 조정 한 다음 오른쪽 축에서 연결하여 작동합니다. 그들은 단지 편의 기능입니다.


그리고 최신 np.stack:

arrays = [asanyarray(arr) for arr in arrays]
shapes = set(arr.shape for arr in arrays)
result_ndim = arrays[0].ndim + 1
axis = normalize_axis_index(axis, result_ndim)
sl = (slice(None),) * axis + (_nx.newaxis,)

expanded_arrays = [arr[sl] for arr in arrays]
concatenate(expanded_arrays, axis=axis, out=out)

즉, 모든 입력의 희미한 부분을 확장 np.expand_dims한 다음 (예 :) 연결합니다. 를 사용 axis=0하면 효과가 np.array.

hstack 문서는 이제 다음을 추가합니다.

기능 concatenate, stack그리고 block일반적인 스택 및 연결 작업을 제공합니다.

np.block또한 새로운 것입니다. 실제로 중첩 된 목록을 따라 재귀 적으로 연결됩니다.


numpy.vstack : 배열을 수직으로 배열 (행 방향) np.concatenate(tup, axis=0). 예와 동일합니다 : https://docs.scipy.org/doc/numpy/reference/generated/numpy.vstack.html

numpy.hstack : 배열을 수평 으로 순서대로 쌓습니다 (열 방식) np.concatenate(tup, axis=1). 첫 번째 축을 따라 연결되는 1D 배열을 제외하고와 동일합니다. 예 : https://docs.scipy.org/doc/numpy/reference/generated/numpy.hstack.html

append는 파이썬의 내장 데이터 구조에 대한 함수입니다 list. 목록에 요소를 추가 할 때마다. 분명히 여러 요소를 추가하려면 extend. 간단히 말해서, numpy의 기능은 훨씬 더 강력합니다.

예:

gray.shape = (n0, n1)이라고 가정합니다.

np.vstack((gray,gray,gray)) 모양 (n0 * 3, n1)을 가질 것입니다. np.concatenate((gray,gray,gray),axis=0)

np.hstack((gray,gray,gray)) 모양 (n0, n1 * 3)을 가질 것입니다. np.concatenate((gray,gray,gray),axis=1)

np.dstack((gray,gray,gray)) 모양 (n0, n1,3)을 갖습니다.


IPython에서 함수 이름 뒤에를 입력하여 함수의 소스 코드를 볼 수 있습니다 ??. 에서 살펴보면 hstack우리가 그냥 래퍼의 주위에 실제로 있다고 볼 수있다 concatenate(유사과 vstackcolumn_stack) :

np.hstack??
def hstack(tup):
...
    arrs = [atleast_1d(_m) for _m in tup]
    # As a special case, dimension 0 of 1-dimensional arrays is "horizontal"
    if arrs[0].ndim == 1:
        return _nx.concatenate(arrs, 0)
    else:
        return _nx.concatenate(arrs, 1)

그래서 나는 당신에게 가장 논리적으로 들리는 이름을 가진 것을 사용한다고 생각합니다.

참조 URL : https://stackoverflow.com/questions/33356442/when-should-i-use-hstack-vstack-vs-append-vs-concatenate-vs-column-stack

반응형