Numpy dizisindeki listelerin listesi


184

Basit bir liste listesini numpy dizisine nasıl dönüştürebilirim? Satırlar ayrı alt listelerdir ve her satır alt listedeki öğeleri içerir.

Yanıtlar:


199

Listelerinizde çok sayıda öğe içeren listeler varsa, Ignacio Vazquez-Abrams'ın yanıtı çalışmaz. Bunun yerine en az 3 seçenek vardır:

1) Bir dizi dizi oluşturun:

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) Bir dizi liste yapın:

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

3) Önce listeleri eşit uzunlukta yapın:

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
Teşekkürler, bunun için buraya geldim. Bir süredir numpy kullanıyor ve bu davranışı önemsiz bulmuş. Bu daha genel vakayı açıklamak için zaman ayırdığınız için teşekkür ederiz.
Adam Hughes

dtype=floatÇok çalışır, dönüştürür Noneiçin np.nanyararlı olabilen.

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

13
bu, dahil edilen tüm listelerin uzunluğu aynı olduğundan, 2B dizideki liste listesini otomatik olarak dönüştürür. Bunu nasıl yapacağınızı biliyor musunuz: tüm listeler aynı uzunlukta olsa bile bir liste dizisi oluşturun? Veya 1D dizisinin 1D dizisindeki bir 2D diziyi dönüştürmek mümkün mü (verimli bir şekilde, yinelemeli bir yöntem veya python eşlemesi yok)
Juh_

7
Alt listeleriniz eşit boyutlarda olmadığından bu sizin için işe yaramazsa aşağıdaki cevaba bakın .
Nikana Reklawyks

@NikanaReklawyks Cevaba baktıktan sonra kafam karıştı ama yorumunuz yardımcı oldu. Listelerimin olması gerekmediğinde pürüzlü olduğunu öğrendim.
Nikhil Girraj

39

Bu, liste listesini Numpy dizisine dönüştürmek için Google'da en iyi arama olduğundan, 4 yaşında olmasına rağmen aşağıdakileri sunacağım:

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

Bunu bu şekilde yapmayı ilk düşündüğümde, kendimden oldukça memnun kaldım çünkü çok basit. Bununla birlikte, daha geniş bir liste listesiyle zamanladıktan sonra, aslında bunu yapmak daha hızlıdır:

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

@ Bastiaan'ın 1 numaralı cevabının tek bir sürekli liste yapmadığını unutmayın, bu yüzden concatenate.

Her neyse ... hstackNumpy'nin zarif kullanımı için yaklaşımı tercih ediyorum .


12
bazı insanlar bunu arıyor olsa da, eminim OP çok boyutlu bir nparr istedi.
Nathan

1
Bunu arıyordum :))
Pallie

26

Bu kadar basit:

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

6

Yine, N seviyeli iç içe listelerin N-boyutlu bir diziye dönüştürülmesi sorununu araştırdıktan sonra hiçbir şey bulamadım, işte benim yolum:

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

Zaten iç içe listeler yapınız varsa [...[...[...]]]parçaya ihtiyacınız olmadığını unutmayın . Sadece arayın gerek np.arraysahip ndmin=number-of-list-layers. (benim durumumda ndmin=number-of-list-layers-minus-1bir nedenden dolayı ihtiyacım olsa da , başka bir katman daha oluşturdu - araştırmamız gerekiyor)
Venryx

Ah tamam, benim durumumdaki sorun, en derin "liste katmanı" için, listelerin hepsinin aynı uzunluğa sahip olmamasıdır, bu da np.arrayonları numpy dizilerine dönüştürmek yerine en derin listeleri "sarmaya" neden olmuştur .
Venryx

-2

Eşit uzunlukta listelerin bir listesi vardı. O zaman bile Ignacio Vazquez-Abramscevabı benim için işe yaramadı. Öğeleri listeler olan bir 1-num numpy dizi var. Aynı sorunla karşılaştıysanız, aşağıdaki yöntemi kullanabilirsiniz

kullanım 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
Neden 10 listeniz olduğunu biliyorsanız neden yığılmaya devam edersiniz, neden np.empty ((10, 4)) ve sonra sadece dolduruyorsunuz?
Mehdi

-4

Sadece pandaları kullan

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

bu yalnızca liste listesi için geçerlidir

bir liste listeniz varsa,

lists(pd.DataFrame(listofstuff).melt().apply(pd.Series).melt().values)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.