numpy配列へのリストのリスト


183

リストの単純なリストを派手な配列に変換するにはどうすればよいですか?行は個別のサブリストであり、各行にはサブリストの要素が含まれています。

回答:


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配列に自動的に変換されます。それをしない方法を知っていますか?すべてのリストが同じ長さであってもリストの配列を作成しますか?または、2D配列を1D配列の1D配列に変換することは可能ですか(効率的には、反復法やPythonマップの
要素はありませ

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。したがって、を追加しました。

とにかく...私hstackはそれがNumpyのエレガントな使用のためのアプローチを好みます。


12
一部の人々はこれを探しているかもしれませんが、私はOPが多次元nparrを望んでいたと確信しています。
ネイサン

1
私はこれを探していました:))
Pallie


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これらの最も深いリストを数の多い配列に変換するのではなく、単に「ラップ」することです。
Venryx

-2

同じ長さのリストのリストがありました。それでもIgnacio Vazquez-Abrams'の答えはうまくいきませんでした。要素がリストである1次元の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.