programing

numpy 배열 목록을 단일 numpy 배열로 변환하는 방법은 무엇입니까?

yellowcard 2023. 5. 20. 10:37
반응형

numpy 배열 목록을 단일 numpy 배열로 변환하는 방법은 무엇입니까?

제가 했다고 가정해보죠;

LIST = [[array([1, 2, 3, 4, 5]), array([1, 2, 3, 4, 5],[1,2,3,4,5])] # inner lists are numpy arrays

나는 개종하려고 노력합니다;

array([[1, 2, 3, 4, 5],
       [1, 2, 3, 4, 5],
       [1, 2, 3, 4, 5])

나는 지금 vstack에서 반복해서 해결하고 있지만 특히 큰 LIST에 대해서는 정말 느립니다.

가장 효율적인 방법은 무엇입니까?

일반적으로 모든 축을 따라 배열의 전체 시퀀스를 연결할 수 있습니다.

numpy.concatenate( LIST, axis=0 )

그러나 목록에 있는 각 배열의 모양과 치수에 대해 걱정해야 합니다(2차원 3x5 출력의 경우 이미 모두 2차원 nx5 배열인지 확인해야 합니다).1차원 배열을 2차원 출력의 행으로 연결하려면 차원을 확장해야 합니다.

Jorge의 대답이 지적했듯이, 기능도 있습니다.stacknumpy 1.10에 소개됨:

numpy.stack( LIST, axis=0 )

이것은 상호 보완적인 접근법을 취합니다: 그것은 각 입력 배열의 새로운 뷰를 만들고 추가 차원을 추가합니다(이 경우, 왼쪽, 즉 각n-요소 1D 어레이가 1-by-B가 됩니다.n연결하기 전에 2D 배열)이 필요합니다.모든 입력 배열의 모양이 동일한 경우에만 작동합니다.

vstack(또는 동등하게)row_stack)는 1차원 및/또는 2차원 어레이의 시퀀스를 사용하고 필요한 경우 자동으로 차원을 확장한 후 전체 목록을 하나로 연결하기 때문에 종종 사용하기 쉬운 솔루션입니다.새 차원이 필요한 경우 왼쪽에 추가됩니다.다시 말하지만, 다음을 반복할 필요 없이 한 번에 전체 목록을 연결할 수 있습니다.

numpy.vstack( LIST )

이 유연한 동작은 구문 단축키로도 나타납니다.numpy.r_[ array1, ...., arrayN ](각괄호 참고).이것은 명시적으로 이름이 지정된 몇 개의 배열을 연결하는 데 좋지만 이 구문은 다음과 같은 배열 시퀀스를 허용하지 않기 때문에 상황에 좋지 않습니다.LIST.

유사한 기능도 있습니다.column_stack그리고 바로가기c_[...]수평(열 단위) 적층 및 거의 평행한 함수의 경우hstack—어떤 이유에서인지 후자는 유연성이 떨어집니다(입력 어레이의 차원성에 대해 엄격하며 1-D 어레이를 열로 취급하는 대신 엔드 투 엔드로 연결하려고 합니다).

마지막으로, 1-D 어레이의 수직적 스택의 특정한 경우에는 다음도 작동합니다.

numpy.array( LIST )

...다른 어레이의 시퀀스로 어레이를 구성할 수 있기 때문에 처음부터 새로운 차원이 추가됩니다.

NumPy 버전 1.10부터는 메소드 스택이 있습니다.모든 차원(모두 동일)의 어레이를 스택할 수 있습니다.

# List of arrays.
L = [np.random.randn(5,4,2,5,1,2) for i in range(10)]

# Stack them using axis=0.
M = np.stack(L)
M.shape # == (10,5,4,2,5,1,2)
np.all(M == L) # == True

M = np.stack(L, axis=1)
M.shape # == (5,10,4,2,5,1,2)
np.all(M == L) # == False (Don't Panic)

# This are all true    
np.all(M[:,0,:] == L[0]) # == True
all(np.all(M[:,i,:] == L[i]) for i in range(10)) # == True

즐거운 시간 되세요.

스피드 성능을 위한 몇 가지 방법을 확인해보니 차이가 없습니다!유일한 차이점은 일부 방법을 사용하면 치수를 주의 깊게 확인해야 한다는 것입니다.

시기:

|------------|----------------|-------------------|
|            | shape (10000)  |  shape (1,10000)  |
|------------|----------------|-------------------|
| np.concat  |    0.18280     |      0.17960      |
|------------|----------------|-------------------|
|  np.stack  |    0.21501     |      0.16465      |
|------------|----------------|-------------------|
| np.vstack  |    0.21501     |      0.17181      |
|------------|----------------|-------------------|
|  np.array  |    0.21656     |      0.16833      |
|------------|----------------|-------------------|

저는 두 실험을 했습니다 - 보다시 저두는 가실험시 을다니습했 - 용사시.np.random.rand(10000)그리고.np.random.rand(1, 10000) 우리가 2D 보다 2D 한다면,np.stack그리고.np.array추가차 - 결과만다니.는 (과 (이기 때문에 하기 위한 추가 합니다.모양은 (1,10000,10000) 및 (10000,1,10000)이므로 이를 방지하기 위해 추가 작업이 필요합니다.

코드:

from time import perf_counter
from tqdm import tqdm_notebook
import numpy as np
l = []
for i in tqdm_notebook(range(10000)):
    new_np = np.random.rand(10000)
    l.append(new_np)



start = perf_counter()
stack = np.stack(l, axis=0 )
print(f'np.stack: {perf_counter() - start:.5f}')

start = perf_counter()
vstack = np.vstack(l)
print(f'np.vstack: {perf_counter() - start:.5f}')

start = perf_counter()
wrap = np.array(l)
print(f'np.array: {perf_counter() - start:.5f}')

start = perf_counter()
l = [el.reshape(1,-1) for el in l]
conc = np.concatenate(l, axis=0 )
print(f'np.concatenate: {perf_counter() - start:.5f}')

다른 해결책은 다음을 사용하는 것입니다.asarray함수:

numpy.asarray(목록)

더 함수를 찾았습니다.reshape.

stack그리고.vstack 빈목록에 대해 합니다.

>>> LIST = [np.array([1, 2, 3, 4, 5]), np.array([1, 2, 3, 4, 5]),np.array([1,2,3,4,5])]
>>> s = np.vstack(LIST)
>>> s.shape
(3, 5)
>>> s = np.vstack([])
ValueError: need at least one array to concatenate

다른 방법은 모양을 바꾸는 것입니다.

>>> s = np.reshape(LIST, (len(LIST),5))
>>> s.shape
(3, 5)
>>> LIST = []
>>> s = np.reshape(LIST, (len(LIST),5))
>>> s.shape
(0,5)

단점은 내부 배열의 길이/형상을 알아야 한다는 것입니다.

언급URL : https://stackoverflow.com/questions/27516849/how-to-convert-list-of-numpy-arrays-into-single-numpy-array

반응형