2013-05-23 3 views
0

매번 다른 수의 열을 가질 수있는 동적 다차원 배열이 있습니다. 사용자는 N 열이있는 파일에서 추출 할 열을 선택하라는 메시지를 표시하고이 수를 기반으로 다차원 배열 'ARRAY_VALUES'가 만들어집니다.Python에서 다차원 배열의 항목을 확인하십시오.

import numpy as num 

DIRECTORY = '/Users/user/Desktop/' 
DATA_DIC_FILE = "%sOUTPUT_DIC/OUTPUT_DICTIONARIES.txt" %(DIRECTORY) 
Choice = str(raw_input('Which columns do you want to use (separated by a comma):\t')).split(',') 
# Input something like this: 1,2,3,4 

String_choice = [] 
PCA_INDEX  = [] 
Columns = len(Choice) 

PCA_INDEX = {} 
# PCA_INDEX is a dictionary that the key is a string whose value is a float number. 
PCA_INDEX['any_string'] = float_number # The dictionary has about 50 entries. 

ARRAY_VALUES = [ [] for x in xrange(Columns) ] 
""" Creating the N-dimensional array that will contain the data from the file """ 
""" This list has the form ARRAY_VALUES = [ [], [], [], ... ] for n-repetitions. """ 

ARRAY_VALUES2 = ARRAY_VALUES 

lines = open(DATA_DIC_FILE).readlines() #Read lines from the file 
for i in range(0, len(ARRAY_VALUES)): 
    ARRAY_VALUES[i] = num.loadtxt(fname = DATA_DIC_FILE, comments= '#', delimiter=',', usecols = [ int(PCA_INDEX[i]) ], unpack = True) 
    """ This saves the lists from the file to the matrix 'ARRAY_VALUES' """ 

이제 I는 N-열에 [... [] [] = ARRAY_VALUES의 형태의 다차원 배열을 가지고있다.

값이 'inf'인 경우 각 열에서 해당 행을 제거하고 싶습니다. 다음 코드를 사용하려고하지만, 나는 컬럼의 수는 동적 만드는 방법을 알고하지 않습니다

for j in range(0, len(ARRAY_VALUES)): 
    for i in range(0, len(ARRAY_VALUES[0])): 
     if num.isinf(ARRAY_VALUES[j][i]) or num.isinf(ARRAY_VALUES[]): # This is where the problem is. 
     # if num.isinf(ARRAY_VALUES[0][i]) or num.isinf(ARRAY_VALUES[1][i] or ... num.isinf(ARRAY_VALUES[last_column][i]: 
      continue 
     else: 
      ARRAY_VALUES2[j].append(ARRAY_VALUES[j][i]) #Save the values into ARRAY_VALUES2. 

사람이 나를 도와이 부분을 수행하는 방법을 말해 줄 수 :

을 그래서 n 형 컬럼이 다차원 어레이
# if num.isinf(ARRAY_VALUES[0][i]) or num.isinf(ARRAY_VALUES[1][i] or ... num.isinf(ARRAY_VALUES[last_column][i]: 

는 출력은 다음과 같다 :

ARRAY_VALUES = [ [8, 2, 3 , inf, 5], 
        [1, 9, inf, 4 , 5], 
        [7, 2, inf, inf, 6] ] 

ARRAY_VALUES2 = [ [8, 2, 5], 
        [1, 9, 5], 
        [7, 2, 6] ] 

--Thanks!

답변

3
>>> a = np.array([[8, 2, 3 , np.inf, 5],[1, 9, np.inf, 4 , 5],[7, 2, np.inf, n 
p.inf, 6]]) 
>>> col_mask = [i for i in range(ncols) if not any(a[:,i] == np.inf)] 
>>> print a[:,col_mask] 
[[ 8. 2. 5.] 
[ 1. 9. 5.] 
[ 7. 2. 6.]] 

이미 사용중인 경우 numpy.array를 먼저 사용하십시오.

는 우리가 각 열을 반복하고 np.infs는 마지막으로 우리가

은 DSM은 지적으로 관심이 우리의 열을 액세스 할 수 NumPy와의 열 색인을 사용하여 허용 열

의 마스크를 만들 확인 당신은 지능형리스트를

col_mask = np.isfinite(a).all(axis=0) 
+1

어쩌면'정당한 NumPy와 함께 마스크를 생성하고 방지 할 수 있습니다 [이 : np.isfinite (가) .ALL (축 = 0)]'? – DSM

+0

확실히 좋은 추가 (그게 내가 거의 numpy를 사용하지 않는다는 것을 보여준다 : P) –

+0

도움을 주셔서 감사합니다! 이것이 내가 필요한 것입니다. 두 방법 모두 유용하고 구현하기 쉽습니다. 감사! – Victor