簡體   English   中英

如何從大型 csv 文件返回具有預期形狀的 numpy arrays?

[英]How to return a numpy arrays with expected shape from large csv file?

我預期的返回數組 S1 的形狀是 (20,10)。 為什么是(22,10)? (2)如何從 df0 和 df1 中提取一些行並有效地構造一個新數組?

csv文件不大,但可以超過8G,參數M可以大於2000。

我的代碼如下。

import dask.dataframe as dd
import numpy as np
from tensorflow.keras.utils import to_categorical

# Define df's
file0 = './dataset_zeros.csv'
file1 = './dataset_ones.csv'
df0 = dd.read_csv(file0,dtype="str",header=None)
df1 = dd.read_csv(file1,dtype="str",header=None)
#Drop the index
df0 = df0.drop(0,axis=1)
df1 = df1.drop(0,axis=1)

def generate_S(file0, file1,init,M,N_in,N_out):
    a = int(M/N_out) # if M=20, N_out=2, then a=10
    #Read csv files
    df0 = dd.read_csv(file0,header=None)
    df1 = dd.read_csv(file1,header=None)
    # Drop the index
    df0 = df0.drop(0,axis=1)
    df1 = df1.drop(0,axis=1)
    
    start = init*a
    end = (init+1)*a

    # extract a=10 rows from df0 (Part 1)
    train_X0 = df0.loc[start:end,:] # select rows
    train_X0 = train_X0.iloc[:,:10] # select columns
    train_X0 = train_X0.values # Convert dataframe to array
    
    # extract a=10 rows from df1 (Part 1)
    train_X1 = df1.loc[start:end]
    train_X1 = train_X1.iloc[:,:10]
    train_X1 = train_X1.values
    

    # concatenate the two parts to a new array
    new_X = np.concatenate((train_X0, train_X1), axis=0)
    
    #================================
    #res = new_X.reshape(M,N_in)
    res= new_X
    return res

# Examples of Parameters
init = 2
M = 20
N_in = 10
N_out =2

# Call the function
S1= generate_S(file0,file1,init,M,N_in,N_out)

dataframe df0 和 df1 看起來像在此處輸入圖像描述

然后我跑

S1.compute_chunk_sizes()

結果是在此處輸入圖像描述

只解決了部分問題。 “我預期的返回數組 S1 的形狀是 (20,10)。為什么是 (22,10)?” 這是因為我沒看懂索引startend : 在df.loc[]中, startend都考慮了,比如我要提取 10 行,我應該設置start=20; end=29 start=20; end=29 ,而不是start=20; end=30 start=20; end=30

正確的代碼是:

start = init*a
end = (init+1)*a - 1
# extract a=10 rows from df0 (Part 1)
train_X0 = df0.loc[start:end,:] # select rows

因此,function generate_S()修改如下。

def generate_S(file0, file1,init,M,N_in,N_out):
    a = int(M/N_out)
    #Read csv files
    df0 = dd.read_csv(file0,header=None)
    df1 = dd.read_csv(file1,header=None)
    # Drop the index
    df0 = df0.drop(0,axis=1)
    df1 = df1.drop(0,axis=1)
    
    start = init*a
    end = (init+1)*a - 1
    
    # extract a=10 rows from df0 (Part 1)
    train_X0 = df0.loc[start:end,:] # select rows
    train_X0 = train_X0.iloc[:,:10] # select columns
    train_X0 = train_X0.values # Convert dataframe to array
    
    # extract a=10 rows from df1 (Part 1)
    train_X1 = df1.loc[start:end]
    train_X1 = train_X1.iloc[:,:10]
    train_X1 = train_X1.values
    
    new_X = np.concatenate((train_X0, train_X1), axis=0)
    new_X.compute_chunk_sizes()
    
    #Test
    print("new_X.SHAPE:")
    print(new_X.shape)
    
    res = new_X.reshape(M,N_in)
    return res

function 將返回一個形狀為(M, 10)的數組(在此代碼中, M=20 )。 問題的第 1 部分已解決。

問題的第 2 部分是: new_X.compute_chunk_sizes()中的 new_X.compute_chunk_sizes generate_S()非常耗時,當 csv 文件很大時。 更糟糕的是,它給出了錯誤的結果。 對於我的大型 csv 文件, new_X的形狀是:

new_X.SHAPE:
(1170, 784)

但預期的是(a, 784) 在這里, a=10 似乎 function generate_S()對每個塊進行操作。 (本例中有 117 個塊。)我真的希望它只運行一次。

我希望找到一個正確有效的方法來實現這個function。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM