2

これには関数があると確信していますが、見つけることができません。

以下のような計算をしています。

# L = large iterator of lots of numpy arrays
def replace_error_nan(data):
    data[data == ERROR_VALUE] = np.nan
    return data
L = (replace_error_nan(l) for l in L)

関数を使用せずに、replace_error_nan によって実行されるすべての操作を実行したいと考えています。これは非常に単純なことだと確信しています。

ありがとう!


「小さな」コメントを残した人が質問に答えました。私は自分自身に答えを出しました。ありがとう!

4

4 に答える 4

2

答え

L = (where(l!=ERROR_VALUE, l, np.nan) for l in L)
于 2013-03-14T05:23:47.803 に答える
2

問題はありません:

for l in L:
  l[l == ERROR_VALUE] = np.nan

ワンライナーを主張する場合__setitem__は、理解して使用できます。しかし、しないでください。

于 2013-03-14T05:16:18.993 に答える
2

使用できますnumpy.place()

L = (np.place(l, l==ERROR_VALUE, np.nan) or l for l in L)
于 2013-03-14T11:42:29.850 に答える
1

イテレータ操作を実行しようとしている場合、@ wimのアプローチは、イテレータがもはや怠惰ではないことを意味するため、適切ではありません。あなたのアプローチは完全に合理的だと思います。小さな関数を定義することは最悪のことではありません。

そうは言っても、私はタブレットを使用していてテストしていませんが、これらの代替手段は機能するはずです。

L = (l for l in L if not l.__setitem__(l == ERROR_VALUE, np.nan))

L = (l.__setitem__(l == ERROR_VALUE, np.nan) or l for l in L)

__setitem__それらはかわいいです(戻ることに依存していますNone)が、実際のコードではおそらく元のアプローチを使用します。


あなたが私のものと同時に解決策を投稿したので、更新してくださいnp.where:それはおそらく最良の解決策ですが、これらのものがそうではないコピーを作成します。かわいらしさが好きなのでそのままにしておきます。

于 2013-03-14T05:24:35.600 に答える