2017-12-22 16 views
2

私は行列を持っており、特定の列に対してのみ条件付き変更を適用したいと考えています。numpy条件に一致する特定の行の要素を変更します。

例:

array([[ 0.15293227, -1.50167614, -1.04974543], 
     [ 1.25396778, 0.21520081, 0.39136217], 
     [-1.1272423 , 1.18971277, 0.19569736]]) 

今1から0よりも大きい最後の列のすべての要素を設定する方法?

答えて

2

は、ここに1つのアプローチ

In [2]: a[:, -1] = a[:, -1] > 0 

In [3]: a 
Out[3]: 
array([[ 0.15293227, -1.50167614, 0.  ], 
     [ 1.25396778, 0.21520081, 1.  ], 
     [-1.1272423 , 1.18971277, 1.  ]]) 

であり、あなたが負のエントリがゼロに設定されるためにしたくない場合は、ここでは冗談の代替である:あなたのコメントに応えて

In [4]: a[:, -1] = a[:, -1] ** (a[:, -1] < 0) 

In [5]: a 
Out[5]: 
array([[ 0.15293227, -1.50167614, -1.04974543], 
     [ 1.25396778, 0.21520081, 1.  ], 
     [-1.1272423 , 1.18971277, 1.  ]]) 

では、(負のエントリだけを残して)正のエントリに挿入するカスタムのfloat値を設定したいとしましょう。

In [6]: float_to_insert_at_positives = 3.14159 

In [7]: (float_to_insert_at_positives - a[:, -1]) * (a[:, -1] > 0) + a[:, -1] 

Out[7]: array([-1.04974543, 3.14159 , 3.14159 ]) 

In [8]: a[:, -1] = (float_to_insert_at_positives - a[:, -1]) * (a[:, -1] > 0) + 
... a[:, -1] 

In [9]: a 
Out[9]: 
array([[ 0.15293227, -1.50167614, -1.04974543], 
     [ 1.25396778, 0.21520081, 3.14159 ], 
     [-1.1272423 , 1.18971277, 3.14159 ]]) 
+0

ありがとう! '**'演算子は何をしますか? – user14492

+0

'**'演算子の左側の引数がNumPyの 'ndarray'であるとき、' ** 'は左側の配列の各要素を右側の配列の対応する要素によって与えられるべき度に上げることを意味します(スカラー指数値のみが与えられている場合は、すべてを同じパワーにする)。通常のPythonでは '** 'は数値型のべき乗を意味します。 「2 ** 3」は2つの3乗である。 – ely

+0

ああそうです。したがって、2番目の方法は 'x ** 0 == 1 'のために1に設定したい場合にのみ機能します。他のフロートに設定する方法はありますか? – user14492

1

このようなものをお探しですか?

import numpy as np 
list_1=np.array([[ 0.15293227, -1.50167614, -1.04974543], 
     [ 1.25396778, 0.21520081, 0.39136217], 
     [-1.1272423 , 1.18971277, 0.19569736]]) 

for i in list_1: 
    if i[-1:][0]>0: 
     i[i.tolist().index(i[-1:])]=1 

print(list_1) 

出力:

[[ 0.15293227 -1.50167614 -1.04974543] 
[ 1.25396778 0.21520081 1.  ] 
[-1.1272423 1.18971277 1.  ]] 

ちょうど1行で楽しみのためにあなたは、このような何かを行うことができます。

[i.__setitem__(i.tolist().index(i[-1:]),1) for i in list_1 if i[-1:][0]>0] 

出力:

[[ 0.15293227 -1.50167614 -1.04974543] 
[ 1.25396778 0.21520081 1.  ] 
[-1.1272423 1.18971277 1.  ]] 
+1

Whoah man。リストの理解は、コアをより読みやすく分かりやすくするためのものです。そうではありません。見た目を上げても常に良いものになるわけではありません。とにかく、ありがとう!私は最初の解決策が好きです。 – user14492

3

現在の回答は複雑すぎます。ブール値と '通常の'インデックス付けを組み合わせると、はるかに簡単に行うことができます。

In [1]: import numpy as np 

In [2]: a = np.array([[ 0.15293227, -1.50167614, -1.04974543], 
    ...:    [ 1.25396778, 0.21520081, 0.39136217], 
    ...:    [-1.1272423 , 1.18971277, 0.19569736]]) 
あなたの最後の列の条件付き

ブール配列:今

In [3]: mask = a[:, -1] > 0. 
    ...: mask 
Out[3]: array([False, True, True], dtype=bool) 

、必要な値を割り当てるためにスライスして、ブール配列の組み合わせを使用して:

インデックスの
In [4]: a[mask, -1] = 1 
    ...: a 
    ...: 
Out[4]: 
array([[ 0.15293227, -1.50167614, -1.04974543], 
     [ 1.25396778, 0.21520081, 1.  ], 
     [-1.1272423 , 1.18971277, 1.  ]]) 

もっとnumpyの場合はhereとなります。

関連する問題