如何使numpy索引更高效、更快



我正在尝试预处理数据集以用于深度学习。我有一个包含数据的csv文件,我使用panda读取它并尝试对其进行预处理。第一列是字符串,其他所有列都是浮动的。我想对所有带有float的列使用min-max规范化。

#Reading csv with pandas
metadatas=pd.read_csv(os.path.join(dataset_dir,"metadata.csv"),header=None)
metadatas=np.array(metadatas)
metadatas_values=metadatas[:,1:]
#normalize the float datas
scaler=preprocessing.MinMaxScaler()
scaler.fit(metadatas_values)
metadatas_scaled=scaler.transform(metadatas_values)
#Create dataframe to insert the string column ('filename') back to data and turn it back to array again
df_scaled=pd.DataFrame(metadatas_scaled)
df_scaled.insert(0,'filename',metadatas[:,0])
metadatas_scaled=np.array(df_scaled)
#Use for loop to index float columns based on string column'filename'
for filename in filenames:
metadata=metadatas_scaled[np.where(metadatas_scaled==filename)[0]][0,1:]

我认为当我有>30000个文件。我认为最耗时的事情是在for循环中对数组进行索引。有没有更有效的方法可以做到这一点?提前谢谢!

这里有一个经过优化的代码。其想法是尽量减少新数组的分配,并使用groupby((代替循环+索引。

# read file and set the first column as index
df = pd.read_csv(
os.path.join(dataset_dir,"metadata.csv"), 
header=None, 
index_col=0
)
# scale all columns except index (our string column)
# + reuse index and column names from the original DataFrame
df_scaled = pd.DataFrame(
MinMaxScaler().fit_transform(df.values), 
index=df.index, 
columns=df.columns
)
# group by index (our string column)
for metadata in df_scaled.groupby(level=0):
# do smth with metadata
...

最新更新