FutureWarning:不推荐使用非元组序列进行多维索引,使用 `arr[tuple(seq)]`
Posted
技术标签:
【中文标题】FutureWarning:不推荐使用非元组序列进行多维索引,使用 `arr[tuple(seq)]`【英文标题】:FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated use `arr[tuple(seq)]` 【发布时间】:2019-03-06 17:56:46 【问题描述】:我已经搜索了 S/O,但找不到答案。
当我尝试使用 seaborn 绘制分布图时,我收到了一个未来警告。我想知道这里可能是什么问题。
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
% matplotlib inline
from sklearn import datasets
iris = datasets.load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['class'] = iris.target
df['species'] = df['class'].map(idx:s for idx, s in enumerate(iris.target_names))
fig, ((ax1,ax2),(ax3,ax4))= plt.subplots(2,2, figsize =(13,9))
sns.distplot(a = df.iloc[:,0], ax=ax1)
sns.distplot(a = df.iloc[:,1], ax=ax2)
sns.distplot(a = df.iloc[:,2], ax=ax3)
sns.distplot(a = df.iloc[:,3], ax=ax4)
plt.show()
这是警告:
C:\ProgramData\Anaconda3\lib\site-packages\scipy\stats\stats.py:1713:
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.
return np.add.reduce(sorted[indexer] * weights, axis=axis) / sumval
有什么帮助吗?你可以运行上面的代码。你会收到警告。
熊猫:0.23.4
,seaborn:0.9.0
,matplotlib:2.2.3
,scipy:1.1.0
,numpy:1.15.0'
【问题讨论】:
我在运行代码时没有收到该警告。也许您想分享您正在使用的 pandas、matplotlib、scipy、numpy 和 seaborn 的哪些版本?我想更新它们可以防止这种情况发生。 @ImportanceOfBeingErnest Pandas:0.23.4
和 seaborn:0.9.0
,matplotlib:2.2.3
,scipy:1.1.0
,numpy:1.15.0'
好的,这是因为使用了 numpy 1.15(我不会使用 numpy 1.14.6)。稍后我可能会更深入地了解哪个软件包会带来这个问题。
所以minimal reproducible example 是sns.kdeplot(data = [1,3,4])
。因此,我想这在 seaborn 的某个地方是个问题。
不,较旧的 seaborn 版本无法解决此问题。要摆脱警告,您可以安装较旧的 numpy 版本(例如 1.14.6);但该警告目前无害。人们希望 scipy 在 numpy 删除对索引的列表支持之前发布一个新版本。我非常有信心这会发生。
【参考方案1】:
对于python>=3.7
,您需要升级您的scipy>=1.2
。
【讨论】:
我同意这个解决方案。在 SciPy 1.2 中,这按预期工作。以前版本的警告可能是由于代码不完整。 除了 SciPy,这也适用于 skimage。【参考方案2】:更完整的回溯会很好。我的猜测是seaborn.distplot
正在使用scipy.stats
来计算一些东西。错误发生在
def _compute_qth_percentile(sorted, per, interpolation_method, axis):
....
indexer = [slice(None)] * sorted.ndim
...
indexer[axis] = slice(i, i + 2)
...
return np.add.reduce(sorted[indexer] * weights, axis=axis) / sumval
所以在最后一行中,列表indexer
用于对sorted
进行切片。
In [81]: x = np.arange(12).reshape(3,4)
In [83]: indexer = [slice(None), slice(None,2)]
In [84]: x[indexer]
/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[84]:
array([[0, 1],
[4, 5],
[8, 9]])
In [85]: x[tuple(indexer)]
Out[85]:
array([[0, 1],
[4, 5],
[8, 9]])
使用切片列表有效,但计划在未来贬值。涉及多个维度的索引应该是元组。在上下文中使用列表是一种较旧的样式,正在逐步淘汰。
所以scipy
开发人员需要解决这个问题。这不是最终用户应该处理的事情。但现在,不用担心futurewarning
。它不影响计算或绘图。有一种方法可以抑制未来的警告,但我不知道。
FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated use `arr[tuple(seq)]` instead of `arr[seq]`
【讨论】:
感谢您的信息 :) 我在想这是我所做的事情导致了错误。因此,我想知道导致错误的原因以及如何修复它。 这是一个很好的解释,尽管没有提供解决方案。请参阅@NetworkMeister 解决方案 - 只需升级 scipy。该错误已在以前的版本中修复。 我觉得这很令人困惑。他们是否对在什么情况下结果不同做出了一些解释?因为据说which will result either in an error or a different result.
。一个错误可能很好,因为它会提醒用户这个问题,但一个无声的不同结果让我更关心。【参考方案3】:
我正在运行 seaborn.regplot,并按照 NetworkMeister 的建议通过升级 scipy 1.2 来消除警告。
pip install --upgrade scipy --user
如果您在其他 seaborn 图中仍然收到警告,您可以预先运行以下命令。这在 Jupyter Notebook 中很有帮助,因为即使您的绘图很棒,警告也会使报告看起来很糟糕。
import warnings
warnings.filterwarnings("ignore")
【讨论】:
【参考方案4】:我遇到了同样的警告。我更新了 scipy、pandas 和 numpy。我还是明白了。当我将seaborn.pairplot
与kde 一起使用时,我明白了,它在下面使用seaborn.kdeplot
。
如果您想摆脱警告,您可以使用警告库。例如:
import warnings
with warnings.catch_warnings():
your_code_block
【讨论】:
仍然收到警告。【参考方案5】:工作示例:
import numpy as np
import warnings
x = np.random.normal(size=100)
with warnings.catch_warnings():
warnings.simplefilter("ignore")
sns.distplot(x, hist=False, rug=True, color="r");
【讨论】:
以上是关于FutureWarning:不推荐使用非元组序列进行多维索引,使用 `arr[tuple(seq)]`的主要内容,如果未能解决你的问题,请参考以下文章
为什么在取消引用非元组时,对取消引用的引用元组的匹配不起作用?
从 Pandas 聚合中重命名结果列(“FutureWarning:不推荐使用带有重命名的字典”)
遍历字典 - FutureWarning:不推荐对具有不存在键的非单调 DatetimeIndexes 进行基于值的部分切片
FutureWarning:不推荐将 issubdtype 的第二个参数从“float”转换为“np.floating”
timedelta64[ns] -> FutureWarning:不推荐传递 timedelta64-dtype 数据,将在未来版本中引发 TypeError