2016-07-19 17 views
0

これは愚かな質問かもしれませんが、答えが見つからないようです。私は以前にnp.saveを使用して保存した大きな配列を持っています。そして、新しいファイルにデータをロードして、各列から別々のリストを作成したいと思います。唯一の問題は、私の大きな配列内の行の一部は、単一のnan値を持っているということですので、配列は、(非常に簡略化した例として)次のようになります。'.npy'ファイルのデータをアレイに直接読み込む

np.array([[5,12,3], 
      [nan], 
      [10,13,9], 
      [nan], 
      [nan]]) 

私は達成するために、forループを使用することができます私はしたいが、これよりも良い方法があった場合、私は思っていた:

import numpy as np 

results = np.load('data.npy') 
depth, upper, lower = [], [], [] 

for item in results: 
    if len(item) > 1: 
     depth.append(item[0]) 
     upper.append(item[1]) 
     lower.append(item[2]) 
    else: 
     depth.append(np.nan) 
     upper.append(np.nan) 
     lower.append(np.nan) 

私の所望の出力は次のようになります。

depth = [5,nan,10,nan,nan] 
upper = [12,nan,13,nan,nan] 
lower = [3,nan,9,nan,nan] 

あなたの助けをありがとう!以前は "data.npy"ファイルを作成するコードを変更して各行の列数が同じになるようにしておく必要がありましたが、そのコードはすでに実行に数時間かかるので、むしろ避けたいと思います!

答えて

1

可変長サブアレイの場合、これはdtype =オブジェクト配列です。ほとんどの場合、これはこれらのサブアレイのリストと同じです。したがって、ほとんどのアクションでは繰り返しが必要です。

あなたの行動上のバリアントがリスト内包だろう

In [61]: dd=[[nan,nan,nan] if len(i)==1 else i for i in d] 

In [62]: dd 
Out[62]: [[5, 12, 3], [nan, nan, nan], [10, 13, 9], [nan, nan, nan], [nan, nan, nan]] 

あなたの3つのターゲットアレイは、その後の列です:

In [63]: np.array(dd) 
Out[63]: 
array([[ 5., 12., 3.], 
     [ nan, nan, nan], 
     [ 10., 13., 9.], 
     [ nan, nan, nan], 
     [ nan, nan, nan]]) 

別のアプローチは、nanで満たされ、その型の配列を作ることです非ナノ値をコピーします。しかし、それもサブ配列の長さを見つけるために反復が必要です。

In [65]: [len(i)>1 for i in d] 
Out[65]: [True, False, True, False, False] 
np.nan

フロートので、nanた2DアレイはDTYPEフロートであろう。

+0

ありがとうございます!私はあなたの最初の提案を使い、 'depth = dd [0]'となるように 'dd'を入れ替えました。私がやっていたすべてのものよりもきれいに見えます。 – Aero

1

パンダを使用して短い方法:

import numpy as np 
import pandas as pd 

data = np.array([[5,12,3], [np.nan], [10,13,9], [np.nan], [np.nan]]) 
df = pd.DataFrame.from_records(data.tolist()) 
df.columns = ['depth','upper','lower'] 

は出力:

>>> df 
    depth upper lower 
0 5.0 12.0 3.0 
1 NaN NaN NaN 
2 10.0 13.0 9.0 
3 NaN NaN NaN 
4 NaN NaN NaN 

あなたは今、あなたはリストが必要な場合は、ご希望の出力

>>> df.depth 
0  5.0 
1  NaN 
2 10.0 
3  NaN 
4  NaN 

を取得するために、各列に対応することができます。

>>> df.depth.tolist() 
[5.0, nan, 10.0, nan, nan] 
関連する問題