pythonリスト、配列、マトリクスの論理スライス

3266 ワード

1データ型
この文章を書く初志は私がマトリックスの論理スライスで問題にぶつかったことで、それからインターネットで関連する文章を探して、多くの文章の作者がこの3種類のデータ型の違いを全然理解していないことを発見して、ある人は2次元配列がマトリックスだと思って、タイトルはすべて書き間違えて、本当に厳格ではありません.まず、この3つのデータ型を科学的に説明します.
  • リストは、翻訳するとlistで、pythonが持参したデータ型で、中のデータ型は任意で、異なることができて、あなたは更に中に別のlistをネストしてもいいです.このように、すべて合法的です:
  • list1 = [['a','b'],1,2,'a','b']
    

    listは数学の演算をすることはできません.2つのlistを加算すると、実は2つのlistをつなぎ合わせるだけです.
    a = [1,2,3,4]
    b = [2,3,4,5]
    a+b 
    Out: [1, 2, 3, 4, 2, 3, 4, 5]
    
  • 配列、翻訳するとarray、python numpyのデータ型で、配列と呼ぶ以上、必ずすべて数字で構成されているので、これでいろいろな加減乗除操作ができます.arrayには1次元、2次元、3次元、n次元がありますが、どのように区別しますか.一般的にはいくつかの中かっこが何次元ですか.たとえば、次の2次元配列は
  • です.
    [[ 0  1  2  3]
     [ 4  5  6  7]
     [ 8  9 10 11]
     [12 13 14 15]]
    

    -マトリックス、翻訳するとmatrixで、python numpyのデータ型です.正直に言うと、このデータ型は少し鶏の肋骨があります.arrayを操作することができますから、文法的に違いがありますが、matrixは私たちの数学で現代に学んだmatrixに最も近いので、短時間では変わりません.使うかどうかは、自分のニーズを見てください.これはarrayと混同されやすく、乗算、論理スライスなどの操作が異なります.下はマトリクスでarrayと同じ長さですが、多くの操作が異なります.
    [[ 0  1  2  3]
     [ 4  5  6  7]
     [ 8  9 10 11]
     [12 13 14 15]]
    

    2論理スライス方法
    リスト、配列、マトリクスが何であるかを知っています.次に、論理スライスについて説明します.これを言う前に、私はあなたが彼らの基本スライス操作について知っていることをデフォルトで説明します.少なくとも1つのリストを持ってリストをスライスすることはできないことを知っていますが、リストを持ってarrayをスライスすることができます.もし私が何を言っているのか分からないなら、自分で基礎知識を勉強してください.
  • リストの論理スライスであり、リストスライスは簡単に3つの数字を組み合わせたものであり、例えばlist 1[1:4:1]は2位から5位までステップ1で数えるが、最後の5位は含まれない.もっと操作して自分で探求して、とても簡単です.ここで解決するのは、リストが論理スライスを採用できるかどうかです.次に、
  • を試験します.
    a = [1,2,3,4]
    a[a==2]
    out:
    1
    

    プログラムは间违いなく报告して、ロジックのスライスを使うことができるようで、しかしよく见て出力するべきなのは2で、どうして出力するのは1で、プログラムが先にa==2が成立するかどうかを判断するため、1つのリストによって判断して、帰ってくるのはFalseで、Falseは0で、自然に0の下标の対応する要素1を返します.次に、論理リストを入力して何を見てみましょうか.
    a = [1,2,3,4]
    a[[True,False,False,False]]
    TypeError: list indices must be integers or slices, not list
    

    残念なことに、リストは下付きとして受け入れられないと前にも言っていたので、論理値でスライスするのは当然実現できません.
  • 配列配列の論理スライスは最も使いやすいもので、実際の工事項目では論理スライスも配列上でよく発生し、この構想は比較的簡単で、まず例を見ます:
  • data = np.arange(16).reshape(4,4)
    data = np.array(data)
    data[data[:,2] == 6]
      :
    array([[4, 5, 6, 7]])
    

    すべて問題なく、条件を満たす行を返したのは、主にdata[:,2]==6が返すことで1次元配列がdataという2次元配列のどの行に対応して出力すべきか、配列の中で論理スライスが簡単で使いやすいことが明らかになったからだ.
  • 行列は配列の中でそんなに使いやすい以上、行列は2次元配列の特殊な形式でも使えるだろう.
    data = np.arange(16).reshape(4,4)
    data = np.mat(data)
    data[data[:,2] == 6]
      :
    IndexError: boolean index did not match indexed array along dimension 1; dimension is 4 but corresponding boolean dimension is 1
    

    残念ながら、エラーを報告して、いくつかのマトリクスで書かれたプログラムに対して、論理スライスは使えないのではないでしょうか.急いで解決策があることを肯定しないでください.しかし、まず原因を知って、data[:,2]==6を実行して、2次元マトリクスを返して、2次元マトリクスでスライスをすること自体が間違っています.通常は1次元配列だけがスライスを作ることができるからです.2 Dマトリクスを1 D配列に変換するには、2つの考え方があります.
      1:
    data = np.arange(16).reshape(4,4)
    data = np.mat(data)
    data[np.array(data)[:,2] == 6]
    Out[99]: matrix([[4, 5, 6, 7]])
          ,               ,          ,               array。
      2:
    data = np.arange(16).reshape(4,4)
    data = np.mat(data)
    data[(data_mat[:,2] == 6).flatten().tolist()]
    Out[101]: matrix([[4, 5, 6, 7]])
       ,             list       
    

    まとめてみると、リストが論理スライスできない配列は私たちが最もよく使う論理スライスの行列であり、論理スライスもできるが、一般的には配列を論理スライスにすればいい.マトリクスの応用シーンがあれば、配列が終わってからマトリクスに戻ればいい.