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]`的主要内容,如果未能解决你的问题,请参考以下文章
为什么在取消引用非元组时,对取消引用的引用元组的匹配不起作用?
从 Pandas 聚合中重命名结果列(“FutureWarning:不推荐使用带有重命名的字典”)
遍历字典 - FutureWarning:不推荐对具有不存在键的非单调 DatetimeIndexes 进行基于值的部分切片
FutureWarning:不推荐将 issubdtype 的第二个参数从“float”转换为“np.floating”
timedelta64[ns] -> FutureWarning:不推荐传递 timedelta64-dtype 数据,将在未来版本中引发 TypeError