最近、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))
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'>
===
どちらのケースでもリスト型で返るようになりました。
これ多分、自分の理解が足りていないんだと思うので、一旦は深追いするのは止めますが、関数が想定通りに動かないときは焦りますね。。奥が深いなぁ。
※コメント投稿者のブログIDはブログ作成者のみに通知されます