首页 > 解决方案 > 我该如何解决这个错误?类型错误:_append_dispatcher() 缺少 1 个必需的位置参数:“值”

问题描述

我正在运行某个代码,执行如下所示的代码后,此错误不断出现:

    import numpy as np
    import matplotlib.pyplot as plt
    import pandas as pd
    from sklearn.preprocessing import MinMaxScaler
    
    X_train = []
    y_train = []
    for i in range(60, 2035):
        X_train=np.append(training_set_scaled[i-60:i, 0])
        y_train=np.append(training_set_scaled[i, 0])
        X_train, y_train = np.array(X_train), np.array(y_train)
        X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))

错误:

    TypeError: _append_dispatcher() missing 1 required positional argument: 'values'

标签: pythonpandasnumpy

解决方案


您似乎混淆了列表和数组操作。您的特定错误发生在np.append. 你(重新)阅读过它的文档吗?当遇到这样的错误时,这应该是你做的第一件事(在跑到 SO 寻求帮助之前!)

“不断出现”是什么意思?您是否继续尝试相同的事情以希望下次不会发生错误?像这样的错误不是随机的:)

首先,您创建两个列表:

X_train = []
y_train = []

通常像这样的列表在循环中使用

for i in range(...):
    X_train.append(i)

重复向列表中添加值。这可以就地工作。

但在本次迭代中,您切换到数组:

for i in range(60, 2035):
    X_train=np.append(training_set_scaled[i-60:i, 0])
    y_train=np.append(training_set_scaled[i, 0])

np.append不是列表追加克隆。好的,你知道它返回了一个新值。但是第二个值在哪里?

training_set_scaled[i-60:i, 0]

索引二维数组、行切片和第一列。那是你的意图吗?还是0应该在外部[],并且是您添加到该切片的值?没有有关阵列的信息和您的意图,我们不能说。

您还将结果分配np.appendX_train。该变量现在是一个数组,最初是一个[]列表。X_train如果您只是要丢弃该值,为什么还要初始化该列表。或者,您是否打算这样做:

X_train.append(training_set_scaled[i-60:i, 0])

将数组切片添加到X_train列表中?

接下来,您将数组包装在np.array. 为什么? np.append,如果有效,则返回一个数组。无需再次“制作”它一个数组!

    X_train, y_train = np.array(X_train), np.array(y_train)
    X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))

最后一步大概会添加一个尾随维度到X_train.

下一次迭代会发生什么?您再次(尝试)将np.append结果分配给X_train. 这会丢弃X_train您在上一次迭代结束时如此费力地创建的内容。

看起来您已经采用了列表追加模型,并笨拙地将其转换为数组追加。它不仅不起作用,而且效率低下。列表追加操作就地添加对列表的引用。 np.append(和其他np.concatenate/stack功能),每次都创建一个新数组,这是一个更昂贵的步骤。通常我们建议在循环中坚持使用列表追加,并在最后一次调用创建数组。

从根本上说,在构建这样的复杂迭代时,请密切注意变量在循环中发生的情况。不要做假设。在交互式会话中测试代码片段。Aprint检查变量,密切注意类型和形状/尺寸。如果您愿意,还可以使用调试器来测试循环中的值。再次 - 阅读文档!


推荐阅读