numpy 배열의 목록 목록


183

간단한 목록을 numpy 배열로 어떻게 변환합니까? 행은 개별 하위 목록이며 각 행은 하위 목록의 요소를 포함합니다.

답변:


199

목록에 다양한 수의 요소가 포함 된 목록이 있으면 Ignacio Vazquez-Abrams의 답변이 작동하지 않습니다. 대신 3 가지 이상의 옵션이 있습니다.

1) 배열 배열을 만듭니다.

x=[[1,2],[1,2,3],[1]]
y=numpy.array([numpy.array(xi) for xi in x])
type(y)
>>><type 'numpy.ndarray'>
type(y[0])
>>><type 'numpy.ndarray'>

2) 목록 배열을 만듭니다.

x=[[1,2],[1,2,3],[1]]
y=numpy.array(x)
type(y)
>>><type 'numpy.ndarray'>
type(y[0])
>>><type 'list'>

3) 먼저 목록의 길이를 동일하게 만드십시오.

x=[[1,2],[1,2,3],[1]]
length = max(map(len, x))
y=numpy.array([xi+[None]*(length-len(xi)) for xi in x])
y
>>>array([[1, 2, None],
>>>       [1, 2, 3],
>>>       [1, None, None]], dtype=object)

15
고마워요, 여기 와서 잠시 동안 numpy를 사용해 왔으며,이 동작은 사소하지 않다는 것을 알았습니다. 시간을내어보다 일반적인 경우를 설명해 주셔서 감사합니다.
Adam Hughes

dtype=float너무 작동, 그것은 변환됩니다 Nonenp.nan유용 할 수있다.

107
>>> numpy.array([[1, 2], [3, 4]]) 
array([[1, 2], [3, 4]])

13
포함 된 모든 목록의 길이가 동일하기 때문에 2D 배열에서 목록 목록을 자동으로 변환합니다. 그렇게하지 않는 방법을 아십니까 : 모든 목록의 길이가 같은 경우에도 목록의 배열을 만드십니까? 아니면 1D 배열의 1 차원 배열 2 차원 배열을 변환 할 수있다 (효율적 내 말은, 어떤 반복적 인 방법을하거나 파이썬 맵 물건)
Juh_

7
하위 목록의 크기가 균일하지 않아서 효과가 없으면 다음 답변을 참조하십시오 .
Nikana Reklawyks

@NikanaReklawyks 답변을보고 난 후에 혼란 스러웠지만 귀하의 의견은 도움이되었습니다. 내 목록이 목록에 없을 때 들쭉날쭉하다는 것을 알았습니다.
Nikhil Girraj

39

이것은 목록 목록을 Numpy 배열로 변환하는 Google의 최고 검색이므로 4 세라는 질문에도 불구하고 다음을 제공합니다.

>>> x = [[1, 2], [1, 2, 3], [1]]
>>> y = numpy.hstack(x)
>>> print(y)
[1 2 1 2 3 1]

내가 이런 식으로 처음 생각했을 때, 너무 간단해서 나 자신에 매우 만족했다. 그러나 더 큰 목록으로 타이밍을 정한 후에는 실제로 이렇게하는 것이 더 빠릅니다.

>>> y = numpy.concatenate([numpy.array(i) for i in x])
>>> print(y)
[1 2 1 2 3 1]

@Bastiaan의 답변 # 1은 단일 연속 목록을 만들지 않으므로을 추가했습니다 concatenate.

어쨌든 ... 나는 hstackNumpy를 우아하게 사용하기위한 접근법을 선호합니다 .


12
일부 사람들이 이것을 찾고있을 수도 있지만 OP가 다차원 nparr을 원한다고 확신합니다.
Nathan

1
나는 이것을 찾고 있었다 :))
Pallie

26

다음과 같이 간단합니다.

>>> lists = [[1, 2], [3, 4]]
>>> np.array(lists)
array([[1, 2],
       [3, 4]])

6

다시 말하지만, N 레벨의 중첩 목록을 N 차원 배열로 변환하는 문제를 검색 한 후에는 아무것도 찾지 못했습니다.

import numpy as np

new_array=np.array([[[coord for coord in xk] for xk in xj] for xj in xi], ndmin=3) #this case for N=3

중첩 목록 구조가 이미있는 경우 [...[...[...]]]부품이 필요하지 않습니다 . 로 전화 np.array하면됩니다 ndmin=number-of-list-layers. (내 경우에는 ndmin=number-of-list-layers-minus-1어떤 이유로 든 추가 계층을 만들었습니다-조사해야 함)
Venryx

아, 좋아, 내 경우의 문제는 가장 깊은 "리스트 레이어"의 경우, 목록의 길이가 모두 같지 않아서 np.array가장 깊은 목록을 numpy 배열로 변환하는 대신 "포장"하는 것입니다.
Venryx

-2

나는 길이가 같은 목록을 가지고있었습니다. 그때조차도 Ignacio Vazquez-Abrams대답이 나에게 적합하지 않았습니다. 요소가 목록 인 1-D numpy 배열이 있습니다. 같은 문제가 발생하면 아래 방법을 사용할 수 있습니다

사용하다 numpy.vstack

import numpy as np

np_array = np.empty((0,4), dtype='float')
for i in range(10)
     row_data = ...   # get row_data as list
     np_array = np.vstack((np_array, np.array(row_data)))

1
왜 당신이 10 개의리스트를 가지고 있고 왜 np.empty ((10, 4))가 아니라고 채우면 알 수 있습니까?
Mehdi

-4

그냥 팬더를 사용하십시오

list(pd.DataFrame(listofstuff).melt().values)

이것은 목록 목록에서만 작동합니다.

당신이 목록의 목록을 가지고 있다면 당신은의 라인을 따라 무언가를 시도 할 수

lists(pd.DataFrame(listofstuff).melt().apply(pd.Series).melt().values)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.