9

Matlab から Python にゆっくりと移行しています...

このフォームのリストがあります

list1 = [[1, 2, nan], [3, 7, 8], [1, 1, 1], [10, -1, nan]] 

および同じ数の項目を持つ別のリスト

list2 = [1, 2, 3, 4]

nan 値を含まない list1 の要素と、対応する list2 の要素を抽出しようとしています。つまり、結果は次のようになります。

list1_clean = [[3, 7, 8], [1, 1, 1]]
list2_clean = [2, 3]

Matlab では、これは論理インデックスを使用して簡単に実行できます。

ここでは、何らかの形式のリスト内包表記がうまくいくと感じていますが、私は行き詰まっています:

list1_clean = [x for x in list1 if not any(isnan(x))]

これは明らかにlist2には役に立ちません。

または、次の論理インデックス作成の試行は機能しませ(「インデックスはリストではなく整数でなければなりません」)。

idx = [any(isnan(x)) for x in list1]
list1_clean = list1[idx]
list2_clean = list2[idx]

私はそれが痛々しいほど些細なことだと確信していますが、私はそれを理解することはできません.

4

3 に答える 3

2

これを簡単に行うことができます:

ans = [(x,y) for x,y in zip(list1,list2) if all(~isnan(x))]

#[(array([ 3.,  7.,  8.]), 2), (array([ 1.,  1.,  1.]), 3)]

各値を抽出できる場所から、次のことを行います。

l1, l2 = zip(*ans) 

#l1 = (array([ 3.,  7.,  8.]), array([ 1.,  1.,  1.]))
#l2 = (2,3)

izipfromモジュールを使用itertoolsすることをお勧めします。問題によっては大量のメモリを節約できるイテレータを使用します。

代わりに、より読みやすい を~使用できます。numpy.logical_not()

Python へようこそ!

于 2013-06-19T15:57:18.177 に答える
0

これはうまくいくはずです。数値が NaN であるか、 を使用していないかを確認しmath.isnanます。

元のリストに要素が 1 つもない場合は、要素をlist1_cleanandに挿入します。これを確認するために、 iterable のいずれかの要素が であるかどうかを返す関数を使用します。list2_cleanNaNanyTrueTrue

>>> list1 = [[1, 2, float('NaN')], [3, 7, 8], [1, 1, 1], [10, -1, float('NaN')]]
>>> list2 = [1, 2, 3, 4]
>>> from math import isnan
>>> list1_clean = [elem for elem in list1 if not any([isnan(element) for element in elem])]
>>> list1_clean
[[3, 7, 8], [1, 1, 1]]
>>> list2_clean = [list2[index] for index, elem in enumerate(list1) if not any([isnan(element) for element in elem])]
>>> list2_clean
[2, 3]

それを小さくして、zipあなたができる使用法を避けるために、

>>> cleanList = [(elem, list2[index]) for index, elem in enumerate(list1) if not any([isnan(element) for element in elem])]
>>> cleanList
[([3, 7, 8], 2), ([1, 1, 1], 3)]
>>> list1_clean = [elem[0] for elem in cleanList]
>>> list2_clean = [elem[1] for elem in cleanList]

any関数 ->

any(...)
    any(iterable) -> bool

    Return True if bool(x) is True for any x in the iterable.

isnan関数 ->

isnan(...)
    isnan(x) -> bool

    Check if float x is not a number (NaN).
于 2013-06-19T15:56:19.133 に答える