2017-12-22 5 views
2

그래서 행렬이 있고 특정 열에 대해서만 조건부 변경을 적용하려고합니다.기준에 일치하는 특정 행의 numpy 변경 요소

예 :

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

지금 방법 0보다 큰 1입니다 마지막 열에있는 모든 요소를 ​​설정하는 방법?

답변

2

여기에 한 가지 방법

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.  ]]) 

이며 부정적인 항목이 0으로 설정하는 것을 원하지 않는 경우, 여기에 익살 대안 : 귀하의 코멘트에 대한 응답으로

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.  ]]) 

, 음수 항목 만 남겨두고 양수 항목에 삽입 할 사용자 정의 부동 소수점 값을 설정한다고 가정 해 봅시다.

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'은 두 개의 삼원 모양입니다. – ely

+0

아하이 봐요. 그래서 두번째 방법은'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.  ]] 

단 한 줄의 재미를 위해이 같은 일을 할 수 있습니다

[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.List comprehension은 핵심을 더 읽기 쉽고 이해하기 쉽게 만들어야합니다 .... 그렇지 않습니다. 거기에 대한보고를 넣어 항상 좋은 일을하지 않습니다. 어쨌든 고마워! 나는 첫 번째 해결책을 좋아한다. – 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을 찾을 수 있습니다.