2014-06-10 3 views
1

두 개의 열이있는 텍스트 파일이 있습니다. 의 그들 r and xi 전화를하자 난에 xi의 모든 음의 값을 제거하는 방법을 알고 r,xi = numpy.loadtext파이썬 목록에 조건 적용

r   xi 
2.5  2.510891 
7.5  -0.436541 
12.5  0.576983 
17.5  0.377067 
22.5  0.19648 
27.5 -0.003876 
32.5  0.117554 
37.5  0.136895 
42.5  0.261832 
47.5 -0.08984 

사용하여로드합니다. 나는 모든 긍정적 인 가치를주는 xi = [i for i in xi if i>0]을 사용합니다.

이제 r 값을 어떻게 제거 할 수 있습니까?

위의 예에서 r 및 xi의 두 번째 행은 xi = -0.4 등으로 제거되어야합니다.

당신이 지금 가지고있는 것과 매우 유사한 지능형리스트를 사용할 수

답변

5

[참고 :. 심지어 객체에 읽는 데 사용되는 명령은 numpy.loadtxt이기 때문에, 우리가 실제로 NumPy와 배열 개체가, 그래서 그 활용하자 질문은 "목록"파이썬을 의미 생각]

목록 이해력을 사용하는 대신 부울 배열을 만들어 색인으로 사용할 수 있습니다. 자습서의 섹션을 "advanced indexing"에서 읽어야합니다. 예를 들면 다음과 같습니다.

>>> r, xi = np.loadtxt("s.dat", skiprows=1, unpack=True) 
>>> keep = xi > 0 
>>> keep 
array([ True, False, True, True, True, False, True, True, True, False], dtype=bool) 

이 배열의 값은 xi > 0이고, 그렇지 않은 경우는 거짓입니다.

>>> r[keep] 
array([ 2.5, 12.5, 17.5, 22.5, 32.5, 37.5, 42.5]) 
>>> xi[keep] 
array([ 2.510891, 0.576983, 0.377067, 0.19648 , 0.117554, 0.136895, 
     0.261832]) 
5

: :

comp_list = [(r_i, xi_i) for r_i, xi_i in zip(r, xi) if xi_i > 0] 

이것은 당신이 다음 비교적 쉽게

데모를 분리 할 수 ​​튜플의 목록을 줄 것이다

>>> r = [2.5, 7.5, 12.5, 17.5, 22.5, 27.5] 
>>> xi = [2.51, -0.43, 0.57, 0.37, 0.19, -0.003] 
>>> comp_list = [(r_i, xi_i) for r_i, xi_i in zip(r, xi) if xi_i > 0] 
>>> comp_list 
[(2.5, 2.51), (12.5, 0.57), (17.5, 0.37), (22.5, 0.19)] 
>>> r, xi = zip(*comp_list) 
>>> r 
(2.5, 12.5, 17.5, 22.5) 
>>> xi 
(2.51, 0.57, 0.37, 0.19) 

또는 당신은 한 번에 모든 것을 할 좋아하는 사람 중 하나 인 경우 :

r, xi = zip(*[(r_i, xi_i) for r_i, xi_i in zip(r, xi) if xi_i > 0]) 
0

왜 전 라인을 필터링이 개 목록에 그들을 분할하고 싶지 않은 : 우리는 지금 우리가 원하는 사람을 선택 keep를 사용할 수 있습니까?

source_lines = numpy.loadtext(f) 
filtered_lines = [x for x in source_lines if x[1] > 0]