Daftar daftar ke array numpy

183

Bagaimana cara mengubah daftar daftar sederhana menjadi array numpy? Barisnya adalah masing-masing sublists dan setiap baris berisi elemen dalam sublist.

Richa Sachdev
sumber

Jawaban:

199

Jika daftar daftar Anda berisi daftar dengan jumlah elemen yang bervariasi maka jawaban Ignacio Vazquez-Abrams tidak akan berfungsi. Sebaliknya ada setidaknya 3 opsi:

1) Buat array array:

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) Buat susunan daftar:

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

3) Pertama, buat daftar panjangnya sama:

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)
Bastiaan
sumber
15
Terima kasih, datang ke sini untuk ini. Telah menggunakan numpy untuk sementara waktu, dan menemukan perilaku ini tidak sepele. Terima kasih telah meluangkan waktu untuk menjelaskan kasus yang lebih umum ini.
Adam Hughes
dtype=floatberfungsi juga, itu akan dikonversi Noneke np.nan, yang mungkin berguna.
107
>>> numpy.array([[1, 2], [3, 4]]) 
array([[1, 2], [3, 4]])
Ignacio Vazquez-Abrams
sumber
13
ini secara otomatis mengkonversi daftar daftar dalam array 2D karena panjang semua daftar yang disertakan adalah sama. Apakah Anda tahu cara tidak melakukannya: membuat array daftar meskipun semua daftar memiliki panjang yang sama? Atau apakah mungkin untuk mengubah array 2D dalam array 1D array 1D (efisien maksud saya, tidak ada metode berulang atau hal-hal peta python)
Juh_
7
Jika itu tidak berhasil untuk Anda karena sublist Anda tidak berukuran genap, lihat jawaban berikut .
Nikana Reklawyks
@NikanaReklawyks Saya bingung setelah melihat jawabannya tetapi komentar Anda sangat membantu. Saya menemukan bahwa daftar daftar saya bergerigi, padahal seharusnya tidak.
Nikhil Girraj
39

Karena ini adalah pencarian teratas di Google untuk mengubah daftar daftar menjadi array Numpy, saya akan menawarkan yang berikut meskipun pertanyaannya adalah 4 tahun:

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

Ketika saya pertama kali berpikir untuk melakukannya dengan cara ini, saya cukup senang dengan diri saya sendiri karena sangat sederhana. Namun, setelah menghitungnya dengan daftar daftar yang lebih besar, sebenarnya lebih cepat untuk melakukan ini:

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

Perhatikan bahwa jawaban Bastiaan # 1 tidak membuat daftar terus menerus tunggal, maka saya menambahkan concatenate.

Ngomong-ngomong ... Saya lebih suka hstackpendekatan untuk itu penggunaan elegan Numpy.

2cynykyl
sumber
12
sementara beberapa orang mungkin mencari ini, saya cukup yakin OP menginginkan nparr multi-dimensi.
Nathan
1
Saya mencari ini :))
Pallie
26

Sesederhana:

>>> lists = [[1, 2], [3, 4]]
>>> np.array(lists)
array([[1, 2],
       [3, 4]])
Rik Poggi
sumber
6

Sekali lagi, setelah mencari masalah mengkonversi daftar bersarang dengan level N menjadi array N-dimensi, saya tidak menemukan apa-apa, jadi inilah cara saya mengatasinya:

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
moose berlapis baja
sumber
Perhatikan bahwa jika Anda sudah memiliki struktur daftar bersarang, Anda tidak perlu [...[...[...]]]bagian itu. Anda hanya perlu menelepon np.array, dengan ndmin=number-of-list-layers. (meskipun dalam kasus saya, saya perlu ndmin=number-of-list-layers-minus-1untuk beberapa alasan, yang lain membuat lapisan tambahan - perlu diselidiki)
Venryx
Ah oke, masalah dalam kasus saya adalah bahwa untuk "lapisan daftar" terdalam, daftar tidak semua memiliki panjang yang sama, yang menyebabkan np.arrayhanya "membungkus" daftar-daftar terdalam daripada mengubahnya menjadi array numpy.
Venryx
-2

Saya memiliki daftar daftar dengan panjang yang sama. Bahkan Ignacio Vazquez-Abramsjawaban itu tidak berhasil untuk saya. Saya mendapat array numpy 1-D yang elemennya adalah daftar. Jika Anda menghadapi masalah yang sama, Anda dapat menggunakan metode di bawah ini

Menggunakan 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)))
Nagabhushan SN
sumber
1
mengapa Anda terus menumpuk jika Anda tahu bahwa Anda memiliki 10 daftar, mengapa tidak np.empty ((10, 4)) dan kemudian mengisinya?
Mehdi
-4

Cukup gunakan panda

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

ini hanya berfungsi untuk daftar daftar

jika Anda memiliki daftar daftar, Anda mungkin ingin mencoba sesuatu di sepanjang baris

lists(pd.DataFrame(listofstuff).melt().apply(pd.Series).melt().values)
Rishan
sumber