goo blog サービス終了のお知らせ 

Shizuka's Style (Tre)

旧yaplogのShizuka's Style (Duo)から記事ごと引っ越しました。今後ともよろしく!

python numpyでのtolist()は不等長配列では動かないみたいにみえる

2020-05-15 14:44:59 | Python
最近、pythonの勉強をしているのですが、どうにも仕様がおかしい動きをする関数ではまり、小一時間悩んでしまったので、備忘のため記事を残します。

まず、以下のソースを見て下さい。
===
import numpy as np
def split_list(items):
 ra = np.array(np.array_split(items, 2, 0)).tolist()

 print (list (ra))
 print (type (ra))
 print (type (ra[0]))
 print ('\n')
===
numpyをインポートし、array_splitをつかって2分割し、それをtolist()を使ってlist型のraに変換、結果とその型を表示しているプログラムです。

さて、これを「split_list([1, 2, 3, 4, 5, 6])」として呼び出します。
===
[[1, 2, 3], [4, 5, 6]]
<class 'list'>
<class 'list'>
===
と表示され、確かに結果がlist型に変換されているように見えます。
ところが。「split_list([1, 2, 3])」として呼び出しますと。。。
===
[array([1, 2]), array([3])]
<class 'list'>
<class 'numpy.ndarray'>
===
あれ?!tolist()でリスト型にしているはずなのにndarrayになっている。。
 →そもそもarray()って表示される意味自体を理解するまでが大変でした

色々調べたのですが、tolist()はリスト型にしてくれるはずなのに、何故か不等長配列を返す場合はどうやってもndarrayが返って来る現象を解決出来ませんでした。

この現象は仕様なのか、それとも私の使い方が悪いのか、初心者なのでよくわかりませんが、ネット上にこれを解決する手段は全く載ってなくて、、、
結局、力業とはわかっていて仕方なく、
===
import numpy as np
def split_list(items):
 rs = []
 ra = np.array(np.array_split(items, 2, 0)).tolist()

 for i in ra:
  rs.insert(len(rs), list(i))

 print (list (rs))
 print (type (rs))
 print (type (rs[0]))
 print ('\n')
===
と、むりやりリスト型指定で新しい配列(rs)を作ってやると

===
[[1, 2, 3], [4, 5, 6]]
<class 'list'>
<class 'list'>

[[1, 2], [3]]
<class 'list'>
<class 'list'>
===
どちらのケースでもリスト型で返るようになりました。

これ多分、自分の理解が足りていないんだと思うので、一旦は深追いするのは止めますが、関数が想定通りに動かないときは焦りますね。。奥が深いなぁ。

最新の画像もっと見る

コメントを投稿