![](/img/trans.png)
[英]How to return a numpy array with values derived from the source array of max values of different arrays of same shape
[英]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)
然后我跑
S1.compute_chunk_sizes()
只解決了部分問題。 “我預期的返回數組 S1 的形狀是 (20,10)。為什么是 (22,10)?” 這是因為我沒看懂索引start
和end
: 在df.loc[]
中, start
和end
都考慮了,比如我要提取 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.