

2次元リストがあり、1つ目の要素と2つ目の要素を条件に3つ目に入れる要素を決定したいです。

[code]

    li=np.array([-1,-2]
                [ 1,-2]
                [-1, 2]
                [ 1, 2]
                 )
    
[/code]

具体的には  
(1つ目の要素 < 0) and (2つ目の要素 < 0) なら3つ目に1を  
(1つ目の要素 > 0) and (2つ目の要素 < 0) なら3つ目に2を  
(1つ目の要素 < 0) and (2つ目の要素 > 0) なら3つ目に3を  
(1つ目の要素 > 0) and (2つ目の要素 > 0) なら3つ目に4を  
追加し、

[code]

    result=[[-1,-2, 1]
            [ 1,-2, 2]
            [-1, 2, 3]
            [ 1, 2, 4]]
    
[/code]

となるようなものです。

内包表現やシーケンス操作(filterやmap、where)を用いる方法で行いたいです。

よろしくお願いいたします。


CC BY-SA 3.0
2017-11-27T10:26:40.370
39882
2017-11-28T06:12:16.143
2017-11-27T10:59:04.027
19110
26341
question
python python3
pythonで配列の1つ目と2つ目の要素を条件に3つ目の要素を決定する。


一応かけましたが、もっと良い方法があるような気がします。  
あと読みにくいので自分は素直に`for`で書かれたものの方が好きです。

[code]

    li = [[-1,-2],
          [ 1,-2],
          [-1, 2],
          [ 1, 2]]
    
    [ i + [(1 if i[0]>0 else 0)+(2 if i[1]>0 else 0)+1] for i in li ]
    
[/code]

出力

[code]

    [[-1, -2, 1], [1, -2, 2], [-1, 2, 3], [1, 2, 4]]
    
[/code]

* * *

**追記**  
少し短くできたので追記。

[code]

    [ i + [int(i[0]>0) + int(i[1]>0)*2 + 1] for i in li ]
    
[/code]

あと`numpy`を使うと以下のようにもかけます。  
もしかすると速いかもしれませんが、すごく読みにくいです。  
もっと良い方法知っている方がいましたら、お願いします。

[code]

    import numpy as np
    ni = np.array(li)
    
    np.hstack(( ni, np.sum((ni>0)*[1,2],1)[None].T+1 ))   # 方法1
    np.vstack(( ni.T, np.sum((ni.T>0)*[[1],[2]],0)+1 )).T # 方法2
    
[/code]


CC BY-SA 3.0
2017-11-27T13:18:38.020
39884
2017-11-28T02:29:34.160
2017-11-28T02:29:34.160
3974
3974
39882
answer


これでどうでしょう

[code]

    >>> import numpy as np
    >>> li = np.array([[-1, -2],
    ...                [ 1, -2],
    ...                [-1,  2],
    ...                [ 1,  2]])
    >>> n = li.shape[0]
    >>> li2 = np.hstack([li, np.zeros((n,1))])
    >>> li2
    array([[-1., -2.,  0.],
           [ 1., -2.,  0.],
           [-1.,  2.,  0.],
           [ 1.,  2.,  0.]])
    >>> li2[np.where((li2[:,0]<0) & (li2[:,1]<0)),2] = 1
    >>> li2[np.where((li2[:,0]>0) & (li2[:,1]<0)),2] = 2
    >>> li2[np.where((li2[:,0]<0) & (li2[:,1]>0)),2] = 3
    >>> li2[np.where((li2[:,0]>0) & (li2[:,1]>0)),2] = 4
    >>> li2
    array([[-1., -2.,  1.],
           [ 1., -2.,  2.],
           [-1.,  2.,  3.],
           [ 1.,  2.,  4.]])
    
[/code]


CC BY-SA 3.0
2017-11-28T06:12:16.143
39899
2017-11-28T06:12:16.143
806
39882
answer