2016-07-12 1 views
2

配列(M、N)があるとします。ここで各 "列"の値NはN台の異なるマシンのデータ記録を表します。また、各「行」Mが、N台のすべてのマシンでデータが記録されたユニークな「タイムスタンプ」を表しているとしましょう。ナンシーアレイ:パディングなしでNansの配列から優先的に順序付けられた値を抽出しますか?

配列(M、N)は、M = 0で最初の「タイムスタンプ」(t0)に対応するように構成され、行M = M(tm)最近のタイムスタンプ記録。

この配列を「AX」としましょう。 AX [0]は、最初の「タイムスタンプ」でN台のマシンの記録データを出力します。 AX [-1]は最新の録音です。

は、ここに私の配列です:

>>AX = np.random.randn(3, 5) 

array([[ 0.53826804, -0.9450442 , -0.10279278, 0.47251871, 0.32050493], 
     [-0.97573464, -0.42359652, -0.00223274, 0.7364234 , 0.83810714], 
     [-0.07626913, 0.85246932, -0.13736392, -1.39977431, -1.39882156]]) 

今、何かが間違っていたとのデータがすべての「タイムスタンプ」ですべてのマシンのために一貫して撮影していなかったと想像します。

Create sample numpy array with randomly placed NaNs

>>AX.ravel()[np.random.choice(AX.size, 9, replace=False)] = np.nan 


array([[ 0.53826804, -0.9450442 ,   nan, 0.47251871,   nan], 
     [  nan,   nan,   nan, 0.7364234 , 0.83810714], 
     [-0.07626913,   nan,   nan,   nan,   nan]]) 

だが、私が最も最近の値を提供する必要があると仮定しましょう:出力がどのように見えるかの例を作成するために、私は、配列内のランダムな位置にナンを挿入するには、以下のリンクの例を踏襲しました記録されたデータの理想的には、これはAX [-1]を参照するほど簡単です。この特定のケースでは、すべてが壊れてしまったので、私はほとんどデータを持っていません。

>>AX[-1] 

array([-0.07626913,   nan,   nan,   nan,   nan]) 

GOAL

私はどのようなデータが何もないよりはましであると認識するので、私はマシンごとに記録さ最新値を使用したいと思います。この特定のシナリオでは、私ができる最高の値を持つ配列を提供します:AXの

[-0.07626913, -0.9450442, 0.7364234, 0.83810714] 

お知らせ欄2には、使用可能なデータがなかったので、私はちょうどそれが出力に含まだスキップ。

np.arraysは非常に直感的ではありません。マニュアルを読んでみると、特殊な関数と変換の量に圧倒されています。

NANのすべてを新しい配列(AY)にフィルター処理し、最後の行AY [-1]を取ることを考えました(これは重要な行ベースの順序を保持すると仮定しています)。 (つまり、最後の「行」を取って、作成することも可能であると仮定すると、

[1,2,3], 
[4,5], 
[6] 

:これは(私はだけではなく、AXの値の便宜のために、ここで整数値を使用しています)の奇妙な形状を持つ配列を作成することになります?)は[6,5,3]を生成し、すべてを完全に混乱させるだろう。最も最近の値が最新の「タイムスタンプ」行の5つのデータポイントのうちの4つのパッドであるため、配列を値で埋め込むことも悪いことです。

np.array構造を使用し、データフレームやパネルを避けながら、かなり痛みを伴わない方法で私が望むものを実現する方法はありますか?

ありがとうございます!

答えて

3

これは多くの興味深い答えを生成することができる種類の質問です。誰かが、おそらくこれより良い方法を考え出すだろうが、物事を始めるために、ここでは一つの可能​​性だ。

In [99]: AX 
Out[99]: 
array([[ 0.53826804, -0.9450442 ,   nan, 0.47251871,   nan], 
     [  nan,   nan,   nan, 0.7364234 , 0.83810714], 
     [-0.07626913,   nan,   nan,   nan,   nan]]) 

np.isfinite(AX)AXがNaN(とは無限ではない真であるブール配列ですが、私は仮定その場合は関係ありません)。ブール値配列Bの場合、B.argmax(axis=0)は、のインデックスを最初にの各列に指定します。 のインデックスを最後にの値にするには、配列を逆にしてargmaxをとり、行数から1を引いた値を減算します。つまり、B.shape[0]-1 - B[::-1].argmax(axis=0)です。この場合、Bnp.isfinite(AX)ので、我々は:

In [100]: k = AX.shape[0] - 1 - np.isfinite(AX)[::-1].argmax(axis=0) 

kが最終値が発生する行インデックスを含みます。各列に1つずつあるので、対応する列インデックスは単にnp.arange(AX.shape[1])です。

In [101]: last_vals = AX[k, np.arange(AX.shape[1])] 

last_vals列はすべてのNaNでない限り、各列の最後の非NaN値の一次元配列last_valsの値もNaNになり、その場合である:

In [102]: last_vals 
Out[102]: array([-0.07626913, -0.9450442 ,   nan, 0.7364234 , 0.83810714]) 

In [103]: last_vals[np.isfinite(last_vals)] 
Out[103]: array([-0.07626913, -0.9450442 , 0.7364234 , 0.83810714]) 
+0

これが本当の独創的なようだ:last_valsに非Na​​N値を排除するために、あなたはnp.isfinite(last_vals)とインデックス、それをすることができます!私はゆっくりと自分の歩みを自分で歩いて、それぞれの部分を理解するようにします。ここではたくさんのことが起こっています:) –

+0

私は「受け入れる」ことを感謝しますが、それはおそらく早すぎました。 stackoverflowの質問に目を留めている賢明なnumpythonistasがあります。あなたが受け入れる前にしばらく待っていれば、さまざまな回答を得る可能性が高くなります。 –

+0

まあ、私はこのサイトではかなり新しく、それが反応を得る動機であるとは気づいていませんでした。人々は受け入れられた回答にコメントし続けますか? –

関連する問題