gpt4 book ai didi

python - 读取 CSV 文件并附加到 Numpy 数组的新列

转载 作者:行者123 更新时间:2023-12-01 06:46:10 25 4
gpt4 key购买 nike

我正在读取 CSV 文件列表,并始终将数据附加到数组中的新列中。我当前的解决方案类似于以下内容:

import numpy as np

# Random generator and paths for the sake of reproducibility
fake_read_csv = lambda path: np.random.random(5)
paths = ['a','b','c','d']

first_iteration=True
for path in paths:
print(f'Reading path {path}')
sub = fake_read_csv(path)
if first_iteration:
first_iteration=False
pred = sub
else:
pred = np.c_[pred, sub] # append to a new column
print(pred)

我想知道是否可以简化循环。例如,像这样:

import numpy as np
fake_read_csv = lambda path: np.random.random(5)
paths = ['a','b','c','d']

pred = np.array([])
for path in paths:
print(f'Reading path {path}')
sub = fake_read_csv(path)
pred = np.c_[pred, sub] # append to a new column

这会引发错误:

ValueError: all the input array dimensions except for the concatenation axis must match exactly

最佳答案

对于初学者来说,每次追加时,都会分配一个全新的数组,这是相当浪费的。相反,您可以在加载所有列后将其组合起来:

pred = np.array([fake_read_csv(path) for path in paths], order='F').T

转置使您读入的行变成列。 order='F' 将确保转置结果的内存布局与问题中的数组相同。

如果您愿意,可以通过预先了解行数或加载第一个数组来预分配缓冲区。这是后者的示例:

first = fake_read_csv(paths[0])
buffer = np.zeros((first.size, len(paths)))
buffer[:, 0] = first
for col, path in enumerate(paths[1:], start=1):
buffer[:, col] = fake_read_csv(path)

如果您关心的是多次调用 reader 函数,您可以在循环中分配数组,如下所示:

buffer = None
for col, path in enumerate(paths):
data = fake_read_csv(path)
if buffer is None:
buffer = np.zeros((data.size, len(paths)))
buffer[:, col] = data

此选项还有一个额外的优点,即它不需要任何额外的检查来查看是否获取数据。

关于python - 读取 CSV 文件并附加到 Numpy 数组的新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59214696/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com