47332

[code]

    a = [[1,2,3],[4,5,6],[7,8,9],[10,11,12]]
    
[/code]

というような形式のデータの中の各要素の2番目のみを取り出して

[code]

    b = [2,5,8,11]
    
[/code]

という形で扱いたいのですがどの様に記述すれば良いですか？

この様な入れ子の配列を二次元配列と呼ぶという所までは検索で辿り着いたのですが、一度の記述で済む方法が分からず、現在一つ一つ要素を取り出して

[code]

    b = [a[0][1],a[1][1],a[2][1],a[3][1]]
    
[/code]

の様に(数十個)記述しております。

(for文を使って取り出そうともしてみたのですが、printしてみると一つ一つバラバラになって配列を作れなかったので断念しました...)

初学者ゆえ初歩的な質問で気分を害されましたら申し訳ございません。  
宜しくお願い致します。


CC BY-SA 4.0
2018-08-07T18:52:52.520
47331
2018-08-08T05:30:04.703
2018-08-08T05:30:04.703
3054
29645
question
python python3
Pythonで二次元配列の中の各要素のn番目だけを取り出して、要素として並べたい


以下のように[リストの内包表記](https://docs.python.jp/3/tutorial/datastructures.html#list-
comprehensions)を利用するとシンプルに実現できます。

[code]

    a = [[1,2,3],[4,5,6],[7,8,9],[10,11,12]]
    b = [x[1] for x in a]
    print(b) #=> [2, 5, 8, 11]
    
[/code]

上記サイトに記載されているように、`for文`による方式や`map`による方式でも実現できますが、 **リストの内包表記** がよりシンプルです。

参考: for文の例

[code]

    a = [[1,2,3],[4,5,6],[7,8,9],[10,11,12]]
    b = []
    for x in a:
        b.append(x[1])
    
    print(b)  #=> [2, 5, 8, 11]
    
[/code]

参考: mapの例

[code]

    a = [[1,2,3],[4,5,6],[7,8,9],[10,11,12]]
    b = list(map(lambda x: x[1], a))
    print(b) #=> [2, 5, 8, 11]
    
[/code]


CC BY-SA 4.0
2018-08-07T19:43:10.430
47332
2018-08-07T19:43:10.430
29553
47331
answer


Pythonには、Scipyスタックと呼ばれるデータサイエンスでよく使われているライブラリーがあります。これらを使うのは難しいというイメージがあるかもしれませんが、プログラムが本職ではない研究者がよく使うツールなので初心者にも優しくできています。それで、リストの内包表記に馴染めない場合は、Scipyスタックから始めるという方法もあります。

今回の質問だと`Pandas`の`DataFrame`を使うと次のようにシンプルにできてしまいます。

[code]

    In [1]: import pandas as pd    
    In [2]: a = [[1,2,3],[4,5,6],[7,8,9],[10,11,12]]
    In [3]: df = pd.DataFrame(a)
    In [4]: print(df[1])
    0     2
    1     5
    2     8
    3    11
    Name: 1, dtype: int64
    
[/code]

`DataFrame`は表計算と同じような構造をしているため、繰り返しの処理をしなくても、表計算で範囲指定してデータを取り出すのとよく似ている「スライス」で２次元配列を扱うことができます。

[code]

    In [5]: df
    Out[5]: 
        0   1   2
    0   1   2   3
    1   4   5   6
    2   7   8   9
    3  10  11  12
    
[/code]


CC BY-SA 4.0
2018-08-07T22:34:35.763
47333
2018-08-07T23:06:57.447
2018-08-07T23:06:57.447
15171
15171
47331
answer


参考までに、Numpy を使うと次のようにできます (参考: [Numpy の Indexing
に関するドキュメント](https://docs.scipy.org/doc/numpy-1.13.0/user/basics.indexing.html))

[code]

    import numpy as np
    a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
    b = list(a[:, 1])
    
    print(b)  #=> [2, 5, 8, 11]
    
[/code]


CC BY-SA 4.0
2018-08-07T23:21:13.297
47334
2018-08-07T23:21:13.297
19110
47331
answer