【问题标题】:Having trouble with Array Appending数组附加有问题
【发布时间】:2019-06-12 15:53:40
【问题描述】:

我觉得被这么简单的事情困住了这么久有点傻,但由于我正要把头穿过墙,我想我会寻求一些帮助。

我有一个循环,可以将我的数据分成更小的子集并循环遍历每个子集。对于每个循环,它会生成一个 y_test 和一个 y_pred 数组。它的大小是可变的,但形状是(X,)。为了绘制两个数组相互对比,我只是将数组分配给一个空数据框并使用matplotlib 进行绘图。

现在,我希望能够保持y_predy_test 的运行总数,这样我就可以看到整个数据集的图表。

我的尝试:

最初,我只是尝试在循环之外创建另一个空数据框,并认为只是将数组附加到我的数据框列的末尾,但我发现将数组附加到数据框是不可能的。

然后我想我将每次通过循环附加到一个空数组并在最后转换为数据帧以进行绘图,但我在那里也没有太多运气,如果我理解正确 - np.append 正在创建每次我附加一个新的附加数据数组?不确定这是否会占用大量内存。

我想知道最好的方法是什么?

这是我的代码(我试图删除很多问题不需要的行,以便更容易理解):

continuous_results = pd.Dataframe()
        tscv = TimeSeriesSplit(n_splits=self.no_splits)
        for train_index, test_index in tqdm(tscv.split(X)):
            X_train, X_test = X.iloc[train_index], X.iloc[test_index]
            y_train, y_test = y.iloc[train_index], y.iloc[test_index]



            self.regressor.fit(X_train, y_train.ravel())

            # predict y values
            y_pred = self.regressor.predict(X_test)


            # plot y_pred vs y_test
            y_df = pd.DataFrame()
            y_pred = y_pred.reshape(len(y_pred), )
            y_test = y_test.reshape(len(y_test), )
            y_df['y_pred'] = y_pred
            y_df['y_test'] = y_test
# failed attempts at continuous dataframe
            continuous_results = continuous_results['Model'].append(y_pred[:,:])
            continuous_results = continuous_results['Actual'].append(y_test)


            y_df.plot()

【问题讨论】:

  • np.append 只是np.concatenate 的一个覆盖函数。每次都会创建一个新数组,因此重复使用时速度很慢。它也很难正确使用(什么是正确的“空”数组开始?)。通常最好将结果收集在一个列表中(列表追加是有效的),并在最后将该列表转换为一个数组。 concatenate 采用数组列表,而 append 仅适用于 2。
  • 我遇到的问题是我正在使用的预测数据生成数组的函数。所以你是说将数组转换为列表并每次通过循环连接?
  • 你会使用 np.array.tolist 来做到这一点吗?
  • 只需将数组附加到一个列表中,然后进行一次连接,或者在末尾添加stack
  • 我不必先将每个数组转换为列表然后附加到我的列表吗?

标签: python arrays pandas numpy dataframe


【解决方案1】:

可以从 numpy 数组创建 DataFrame,反之亦然:

# If you already have data as an array
data = np.random.random((10,5))
# Create a dataframe from a numpy array
df = pd.DataFrame(data)
# Create a numpy array from a dataframe
as_array = df.to_numpy()

如果您想要/必须循环,您可以使用 numpy 数组和 DataFrame 来执行此操作。从列表中构造 numpy 比在循环中连接数组更有效:

# Looping - arrays can handle n dimensions
data = []
for i in range(10):
    row = np.random.random((1,1,1,1,1))
    # Add a second dimension
    row = row[:,np.newaxis]
    # Remove the second dimension
    row = row[:,-1]
    # A list can hold anything
    data.append(row)
# Construct an array from a list of arrays
array = np.array(data)

DataFrames 也可以做到这一点,但数据帧行只能有一个维度。

# looping - dataframes can work with only one dimension per row
data = []
for i in range(10):
    data.append(np.random.random(5))
# Construct a DataFrame from a list of values
df = pd.DataFrame(data)

为了附加到现有的 DataFrame,需要先从数据中创建 Series 或 DataFrame。

df = pd.DataFrame()
for i in range(10):
    n = np.random.random(1)
    # To append to a DataFrame, first create a Series (a row or a column) or a DataFrame
    row = pd.Series(n, name=i)
    # append a Series (or a DataFrame) to the "bottom" of another DataFrame
    df = df.append(row)

【讨论】:

    猜你喜欢
    • 2018-12-20
    • 1970-01-01
    • 2020-02-10
    • 1970-01-01
    • 2022-11-09
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    相关资源
    最近更新 更多