2014-01-09 3 views
1

numpy.loadtxt으로 CSV 파일을 읽고 싶습니다. usecols 매개 변수를 사용하여 읽으려는 열을 지정할 수 있다는 것을 알고 있습니다. 그러나 실제로하고 싶은 것은 이 아닌 열의 목록을 지정하는 것입니다. 실제로 파일에 포함될 열의 수를 실제로 알지 못하기 때문입니다.numpy.loadtxt - 부정 사용 usecols?

파일의 처음 몇 줄을 읽은 다음 총 열 수를 확인한 다음 읽을 열 집합을 수동으로 계산하는 것 외에는 다른 방법이 있습니까?

답변

2

언급 한대로 첫 번째 행을 읽지 않아도됩니다.

do_not_read_cols = [3, 4, 9] 
data = np.loadtxt('filename') 
data = np.delete(data, do_read_cols, axis=1) 

이 몹시 메모리 효율이되지 않습니다,하지만 loadtxt 아주 메모리 효율로 시작하는 시도하지 않습니다

그러나, 이렇게하는 것이 더 쉬울 수 있습니다. 대다수의 열을 삭제하지 않는 한, 으로 전화를 걸면 더 많은 메모리를 사용하게됩니다. 이는 delete이 작성하는 후속 임시 복사본보다 많습니다. 당신이 메모리를 효율적으로 원하는 pandas을 사용하지 않으려면


또 다른 옵션은이 같은, 아래 내 댓글에 확장하려면 : (참고 :. 조금 엉성하게 작성)

import numpy as np 

def generate_text_file(length=1e6, ncols=20): 
    data = np.random.random((length, ncols)) 
    np.savetxt('large_text_file.csv', data, delimiter=',') 

def iter_loadtxt(filename, delimiter=',', skiprows=0, skipcols=None,dtype=float): 
    if skipcols is None: 
     skipcols = [] 
    def iter_func(): 
     with open(filename, 'r') as infile: 
      for _ in range(skiprows): 
       next(infile) 
      for line in infile: 
       line = line.rstrip().split(delimiter) 
       for i, item in enumerate(line): 
        if i in skipcols: 
         continue 
        yield dtype(item) 
     iter_loadtxt.rowlength = len(line) - len(skipcols) 

    data = np.fromiter(iter_func(), dtype=dtype) 
    data = data.reshape((-1, iter_loadtxt.rowlength)) 
    return data 

#generate_text_file() 
data = iter_loadtxt('large_text_file.csv') 
+0

감사합니다.하지만 불행히도 메모리 효율이 처음부터이 모든 이유입니다. 따라서이 문제가 저에게 효과적이지 않습니다. – Nils

+0

@Nils - 메모리 효율이 걱정된다면,'loadtxt'를 사용하지 마십시오. 어레이를로드하는 데 필요한 메모리를 ~ 8x 사용합니다. (내 자신의 대답을 연결하는 것이 아니라 예제로 보자 : http://stackoverflow.com/questions/8956832/python-out-of-memory-on-large-csv-file-numpy/8964779#8964779)' pandas'는 실제로 그 경로를 가고 싶다면 실제로 매우 효율적입니다. 'pandas'는 각 column_을 자신의 배열에 효과적으로 저장하기 때문에, 한 세트의 열을 삭제해도 복사본을 만들 필요가 없습니다. 또는 몇 줄에로드 생성기를 직접 작성하고'np.fromiter'를 사용하여 읽을 수 있습니다. –

+0

일부 기존 코드를 수정하는 중이므로 전체 패키지를 사용하기 위해 전체 메서드를 다시 작성하지 않는 것이 좋습니다. 그러나 그것이 나의 결정 이었 더라면 나는 아마 첫번째로 팬더를 사용했을 텐데, 예. :) – Nils