source

numpy 배열의 일부 치수만 평탄하게 만드는 방법

gigabyte 2022. 9. 13. 22:07
반응형

numpy 배열의 일부 치수만 평탄하게 만드는 방법

Numpy 배열의 첫 번째 치수 중 일부만 "서브 플랫"하거나 평탄하게 만드는 빠른 방법이 있습니까?

예를 들어, 차원의 numpy 배열이 주어진 경우(50,100,25), 결과 치수는 다음과 같습니다.(5000,25)

numpy.reshape를 보세요.

>>> arr = numpy.zeros((50,100,25))
>>> arr.shape
# (50, 100, 25)

>>> new_arr = arr.reshape(5000,25)
>>> new_arr.shape   
# (5000, 25)

# One shape dimension can be -1. 
# In this case, the value is inferred from 
# the length of the array and remaining dimensions.
>>> another_arr = arr.reshape(-1, arr.shape[-1])
>>> another_arr.shape
# (5000, 25)

Alexander의 답변 -np.reshape에 대한 약간의 일반화에서는 -1을 인수로 사용할 수 있습니다.즉, "전체 어레이 크기를 다른 모든 치수의 곱으로 나눈 값"을 의미합니다.

예: 마지막 치수를 제외한 모든 치수를 평평하게 하려면:

>>> arr = numpy.zeros((50,100,25))
>>> new_arr = arr.reshape(-1, arr.shape[-1])
>>> new_arr.shape
# (5000, 25)

Peter의 답변에 대한 약간의 일반화 - 3차원 배열을 넘어서려면 원래 배열의 모양에 대한 범위를 지정할 수 있습니다.

예: 마지막 두 차원을 제외한 모든 차원을 평평하게 하려면:

arr = numpy.zeros((3, 4, 5, 6))
new_arr = arr.reshape(-1, *arr.shape[-2:])
new_arr.shape
# (12, 5, 6)

편집: 이전 답변에 대한 약간의 일반화입니다. 물론 리쉐이프 시작 부분에서도 범위를 지정할 수 있습니다.

arr = numpy.zeros((3, 4, 5, 6, 7, 8))
new_arr = arr.reshape(*arr.shape[:2], -1, *arr.shape[-2:])
new_arr.shape
# (3, 4, 30, 7, 8)

대체 접근법은 다음과 같습니다.numpy.resize()예를 들어 다음과 같습니다.

In [37]: shp = (50,100,25)
In [38]: arr = np.random.random_sample(shp)
In [45]: resized_arr = np.resize(arr, (np.prod(shp[:2]), shp[-1]))
In [46]: resized_arr.shape
Out[46]: (5000, 25)

# sanity check with other solutions
In [47]: resized = np.reshape(arr, (-1, shp[-1]))
In [48]: np.allclose(resized_arr, resized)
Out[48]: True

numpy.vstack이 상황에 딱이다

import numpy as np
arr = np.ones((50,100,25))
np.vstack(arr).shape
> (5000, 25)

사용하는 것을 선호합니다.stack,vstack또는hstack에 걸쳐서reshape왜냐면reshape데이터를 스캔하여 원하는 형태로 강제하는 것처럼 보입니다.예를 들어 열 평균을 취하려는 경우 문제가 발생할 수 있습니다.

여기 내가 말하는 것의 예가 있다.다음과 같은 어레이가 있다고 가정합니다.

>>> arr.shape
(2, 3, 4)
>>> arr 
array([[[1, 2, 3, 4],
        [1, 2, 3, 4],
        [1, 2, 3, 4]],

       [[7, 7, 7, 7],
        [7, 7, 7, 7],
        [7, 7, 7, 7]]])

형상 배열(3,8)을 얻기 위해 두 가지 방법을 모두 적용한다.

>>> arr.reshape((3,8)).shape
(3, 8)
>>> np.hstack(arr).shape 
(3, 8)

하지만 각각의 경우에서 어떻게 재형성되었는지 살펴보면,hstack원래 배열에서 계산할 수 있는 열 합계를 구할 수 있습니다.모양을 바꾸면 이 작업이 불가능합니다.

>>> arr.reshape((3,8))
array([[1, 2, 3, 4, 1, 2, 3, 4],
       [1, 2, 3, 4, 7, 7, 7, 7],
       [7, 7, 7, 7, 7, 7, 7, 7]])
>>> np.hstack(arr)
array([[1, 2, 3, 4, 7, 7, 7, 7],
       [1, 2, 3, 4, 7, 7, 7, 7],
       [1, 2, 3, 4, 7, 7, 7, 7]])

언급URL : https://stackoverflow.com/questions/18757742/how-to-flatten-only-some-dimensions-of-a-numpy-array

반응형