【问题标题】:How to downgrade numpy?如何降级numpy?
【发布时间】:2019-01-25 11:50:56
【问题描述】:

我有错误

TypeError: slice indices must be integers or None or have an __index__ 
method

并搜索解决方案并得到我需要降级 numpy 的版本,然后尝试使用此命令

python
import numpy 
numpy.__version__

得到了

>>> numpy.__version__
'1.14.5'

但是当我使用时

pip show numpy
Name: numpy
Version: 1.11.0
Summary: NumPy: array processing for numbers, strings, records, and 
objects.
Home-page: http://www.numpy.org
Author: NumPy Developers
Author-email: numpy-discussion@scipy.org
License: BSD
Location: /usr/local/lib/python3.4/dist-packages
Requires: 
Required-by: 

现在python使用的版本是什么?

命令

$ python3 -m pip --version
$ pip --version 
pip 18.0 from /usr/local/lib/python3.4/dist-packages/pip (python 3.4)

$ python -m pip --version
pip 18.0 from /usr/local/lib/python2.7/dist-packages/pip (python 2.7)

【问题讨论】:

  • 代码在哪里?你不太可能降级 numpy
  • 您的系统上很可能(至少)安装了两个独立的 Python 副本,python 运行一个,但pip 运行另一个。如果您不想学习如何处理这种混乱,最简单的做法是始终使用python -m pip 代替pip。这样,您就知道无论python 是什么,您都在使用与之配套的pip
  • 在 Unix 系统上解决此问题的一种常见方法是使用预安装的 Python(如 Apple 的 2.7 或 Ubuntu 的 3.4),它不附带 pip,然后执行确实附带pip的第二个Python的第三方安装。现在 python 可以运行预安装的 Python,因为它在 PATH 上较早,但 pip 将安装到您的第二个 Python 中,因为在 PATH 上没有其他 pip 出现在它之前。
  • @abarnert 感谢您的回答,是的,我有两个版本,但对不起,您编写的命令不会给出版本!我应该尝试另一件事吗
  • 我不知道那句话的后半部分是什么意思。你能在你的问题中运行pip --versionpython --versionpython3 -m pip --versionedit 的结果吗?

标签: python numpy jupyter-notebook


【解决方案1】:

您可以使用 --upgrade 标志降级,它可以双向工作,例如

pip install --upgrade numpy==1.10.1

【讨论】:

    【解决方案2】:

    我怀疑你真的确实需要或想要降级 NumPy。

    但这不是你的问题的真正意义所在。你想知道为什么pip 显示的是一件事而python 显示的是另一件事,以及你能做些什么。


    您看到不同内容的原因是您的 pip 与您的 python 不一致。

    当您运行 python 时,这就是您的 Python 2.7,而您的包 import 来自您的 2.7 库,位于 /usr/local/lib/python2.7/

    当您运行 pip 时,它正在使用您的 Python 3.4,并在您的 Python 3.4 库(位于 /usr/local/lib/python3.4/)中安装和查找内容。

    所以,pip show numpy 向您展示了您的 Python 3.4 拥有的 NumPy 版本,它完全独立于您的 Python 2.7 拥有的 NumPy 版本。

    如果您不打算使用 Python 2.7,解决方案是改为运行 Python 3.4,通常只需使用 python3 而不是 python

    如果您确实打算使用 Python 2.7,则解决方案是使用随附的 pip。为此,您可能有一个名为 pip2pip2.7 的命令,但最安全的方法是使用 python -m pip 而不是 pip


    附带说明,鉴于您的 3.4 NumPy 的安装位置,看起来您可能已经完成了类似 apt-get python3-numpyyum python-numpy 或类似的操作来安装它,而不是 pip install numpy。并且可能类似apt-get python2-numpy 也可以获得 2.7 版本。如果是这样,您可能希望使用发行版的包管理器而不是使用pip,以与最初安装它相同的方式降级或升级它。如果不是……那么请忽略这一段。


    如果这一切看起来太复杂了,但您确实需要同时拥有 Python 2.7 和 Python 3.4,那么您应该考虑两件事:

    • 始终使用虚拟环境。尽可能不要全局安装任何东西;选择一个环境来安装它。无论环境处于活动状态,pythonpip 都适用于该环境。
    • 安装最新版本的 Anaconda,使用最新版本的 Python(截至今天为 3.7),然后要求它安装 3.4 和 2.7 的 conda 环境。使用这些环境,甚至永远不要碰你的系统 3.4 和 2.7。

    【讨论】:

    • 我认为你是对的。鉴于它位于dist-packages,它可能是使用aptyum 而不是pip 安装的。非常敏锐的观察力。
    • 感谢您的时间,我正在使用 jupyter 运行代码,使用 pyhton2 或 python3 给出了相同的错误,所以我的问题是因为 numpy ?
    • @prog 正如我在顶部所说的,以及其他人在 cmets 中所说的那样,您的错误可能与需要降级 numpy 无关。您的代码中可能存在需要修复的错误。如果您需要这方面的帮助,请创建一个新问题,并给我们一个 minimal reproducible example 来演示该问题,以便我们为您调试。
    • 代码不是我的,与其他人合作得很好,但我的问题是我猜是版本的问题,因为安装了两个版本的 python,我对它们感到困惑
    【解决方案3】:

    您可能对 python2、python3 和不同的 python virtual environments 感到困惑。

    在你的情况下,这是最可靠的来源

    $ python
    >>> import numpy
    >>> numpy.__version__
    '1.14.5'
    

    要升级/降级 numpy,您需要使用与您正在使用的 python 对应的 pip。我认为您使用的是 python 2.7。在/usr/local/lib/python2.7/dist-packages/pip 处查找与已安装包相对应的pip 可执行文件。

    这不是“正确”的方式,但它会起作用

    python -m pip install numpy==x.y.z
    
    • python 将只对应您正在使用的 python 解释器
    • -m pip 将找到与您安装的 python 2.7 对应的正确 pip
    • numpy==x.y.z 将强制降级

    现在,您可能会遇到权限问题,这会诱使您使用sudo。此时,您可以尝试添加--user 标志......但如果您真的必须使用sudo,那么请考虑创建一个virtualenv。 (请。)

    可能是正确的做法

    其他人对此发表了评论:也许您的索引实际上不是整数。

    (相关:Slice indices must be integers or None or have __index__ method

    在代码中找到索引到列表中的位置,并确保它们实际上是整数。

    assert isinstance(a, int), 'a must be an int'
    assert isinstance(b, int), 'b must be an int'
    x = y[a:b]
    

    继续添加这些类型断言,直到找到错误。

    【讨论】:

    • python -m pip 实际上是正确的方法。 PyPA 文档曾一度建议您始终运行pip,如果您有多个 Python 并且不使用虚拟环境。他们似乎已经放弃了这一点,而只是在你拥有多个 Python 时推动你始终使用虚拟环境,并且只提到 -m pip 作为不能或不会这样做的用户的后备。但它仍然比试图找出哪个pip 可执行文件与哪个python 匹配要好。
    • 是round()函数,用于将数字转换为整数?
    • @prog 尝试仅使用 int(a),正如 Pieters 在链接问题中所建议的那样。
    • @prog 这取决于。你想让2.91 表示2 还是3int 函数将截断为 2round 函数将四舍五入到最接近的整数,即3。 (在 Python 2.7 中,它可能会给你 float 3.0,因此你可能必须实际执行 int(round(a))。在 3.x 中,这不是问题。)
    • pip install numpy==1.14.5 ... Collecting numpy==1.14.5 ... Successfully installed numpy-1.16.3 什么!?
    猜你喜欢
    • 2019-12-27
    • 1970-01-01
    • 2018-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多