FutureWarning:不建议使用非元组序列进行多维索引编制,而应使用`arr [tuple(seq)]`而非`arr [seq]`

时间:2018-08-31 07:50:57

标签: python arrays python-3.x numpy matplotlib

我不想在多维索引中使用非元组序列,以便该脚本在更改时将支持将来的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())

3 个答案:

答案 0 :(得分:11)

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

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中的

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)]`

最新的解决方案可帮助我们在scipy.stats包中识别问题功能。它构造了一个切片列表,并且无需进一步转换为元组就可以使用它。

答案 1 :(得分:6)

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

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

当我研究numpy的索引编制方法时,该警告更加有意义。但是,我并不真正理解为什么事情需要这样发展。

答案 2 :(得分:3)

在我的案例中,Upadating Scipy解决了此问题。原因不推荐使用Scipy.stats类。