FutureWarning:不推荐使用非元组序列进行多维索引,使用 `arr[tuple(seq)]` 而不是 `arr[seq]`

Posted

技术标签:

【中文标题】FutureWarning:不推荐使用非元组序列进行多维索引,使用 `arr[tuple(seq)]` 而不是 `arr[seq]`【英文标题】:FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated use `arr[tuple(seq)]` instead of `arr[seq]` 【发布时间】:2019-02-06 05:10:40 【问题描述】:

我不想将非元组序列用于多维索引,以便脚本在这种情况发生变化时支持 Python 的未来版本。

以下是我用于绘制图形的代码:

data = np.genfromtxt(Example.csv,delimiter=',', dtype=None, names=True, 
    converters=0: str2date)

p1, = host.plot(data["column_1"], data["column_2"], "b-", label="column_2")
p2, = par1.plot(data["column_1"], data['column_3'], "r-", label="column_3")
p3, = par2.plot(data["column_1"], data["column_4"], "g-", label="column_4")

host.set_xlim([data["column_1"][0], data["column_1"][-1]])
host.set_ylim(data["column_2"].min(), data["column_2"].max())
par1.set_ylim(data["column_3"].min(), data["column_3"].max())
par2.set_ylim(data["column_4"].min(), data["column_4"].max())

【问题讨论】:

我怀疑有问题的代码在 matplotlib 中。你的版本是最新的吗? @AndrasDeak 是的,我已经更新了版本。 您可以将警告变成错误using the first two lines of this answer(我自己从未使用过)。这可能会告诉您错误来自哪个模块和代码行。 其实这里的“data”是一个numpy数组。并且 "data["column_1"]" 是一个非元组序列。我没有面对 numpy==1.14.5 的警告。问题出在 numpy 的更新版本中。有没有办法可以将其转换为“arr[tuple(seq)]”? 不,问题不是numpy的更新版本。该警告是 numpy 中的新警告,表示将来会弃用,因此您需要修复 其他所有问题 【参考方案1】:

我可以通过以下方式重现警告:

In [313]: x = np.zeros((4,2))
In [315]: x[:,1]
Out[315]: array([0., 0., 0., 0.])

通过将: 替换为slice(None),我们可以将此索引编写为:

In [316]: x[[slice(None),1]]
/usr/local/bin/ipython3:1: FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated; use `arr[tuple(seq)]` instead of `arr[seq]`. In the future this will be interpreted as an array index, `arr[np.array(seq)]`, which will result either in an error or a different result.
  #!/usr/bin/python3
Out[316]: array([0., 0., 0., 0.])

它真的应该是一个元组,而不是一个列表:

In [317]: x[(slice(None),1)]
Out[317]: array([0., 0., 0., 0.])
In [318]: x[tuple([slice(None),1])]
Out[318]: array([0., 0., 0., 0.])

警告告诉我们列表格式过去是可以的,但将来会产生错误。

我没有看到您的代码在列表索引中执行这种切片。

data from genfromtxt 是结构化数组,所以按字段名索引是正常的:data["column_1"]。所以很可能警告是在plot 代码中生成的。但我们不知道在哪里。警告没有给出任何类型的错误堆栈跟踪,是吗?

因此,如果没有像 data 这样的示例数组或像 Example.csv 这样的 csv 文件,我们就无法重现警告,并进一步挖掘。


首先,我会在您的每个代码行之间添加某种print。目标是确定哪个matplotlib 调用产生了警告。

如果例如它是在

中产生的
host.set_xlim([data["column_1"][0], data["column_1"][-1]])

我可能会尝试将调用更改为

host.set_xlim((data["column_1"][0], data["column_1"][-1]))

host.set_xlim(data["column_1"][0], data["column_1"][-1])

这有点疯狂......

编辑

FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated use `arr[tuple(seq)]`

这个最新的 SO 帮助我们识别 scipy.stats 包中的问题函数。它构造一个切片列表,并在不进一步转换为元组的情况下使用它。

【讨论】:

可悲的是,用户确实希望库能够开箱即用,但在识别潜在问题时(例如通过提供可重现的示例),任何对这些问题的请求都被忽略了。 @ImportanceOfBeingErnest 可重现的示例通常很难构建,尤其是当许多用户在时间压力下使用专有数据时。有时更容易(或看起来更容易)耸耸肩,要么忽略它,要么找出解决方法。【参考方案2】:

在我的情况下,更新 Scipy 解决了这个问题。因为 Scipy.stats 类已被弃用。

【讨论】:

【参考方案3】:

我会在发布之前对此进行测试(好吧,我确实针对我遇到相同问题的区域进行了测试),但我怀疑这会对您有所帮助。使用您在上面调用绘图的第一行,使用我展示的元组类型转换,并对调用绘图的其他行执行相同操作。

p1, = host.plot(tuple(data["column_1"]), 
                tuple(data["column_2"]), 
                "b-", label="column_2")

当我研究 numpy 索引方法时,警告更有意义。但是,我真的不明白为什么事情需要这样发展。

【讨论】:

以上是关于FutureWarning:不推荐使用非元组序列进行多维索引,使用 `arr[tuple(seq)]` 而不是 `arr[seq]`的主要内容,如果未能解决你的问题,请参考以下文章

numpy多维索引:使用np数组并列出不同的结果

为什么在取消引用非元组时,对取消引用的引用元组的匹配不起作用?

从 Pandas 聚合中重命名结果列(“FutureWarning:不推荐使用带有重命名的字典”)

遍历字典 - FutureWarning:不推荐对具有不存在键的非单调 DatetimeIndexes 进行基于值的部分切片

FutureWarning:不推荐将 issubdtype 的第二个参数从“float”转换为“np.floating”

timedelta64[ns] -> FutureWarning:不推荐传递 timedelta64-dtype 数据,将在未来版本中引发 TypeError