如何为PyPy获得稳定版本的numpy?

时间:2014-11-20 07:25:00

标签: python numpy pypy

我已从链接https://bitbucket.org/pypy/pypy/downloads/pypy-2.4.0-src.tar.bz2下载了PyPy便携版,并且我已使用命令pip install git+https://bitbucket.org/pypy/numpy.git

为PyPy安装了numpy

安装成功,但我无法使用numpy.min这样的功能。

>>>> numpy.min([1,2,3])    
Traceback (most recent call last):
...
TypeError: expected integer, got NoneType object

所以,我运行了numpy.test(),结果是

FAILED (KNOWNFAIL=5, SKIP=24, errors=886, failures=152)
<nose.result.TextTestResult run=3367 errors=886 failures=152>

我安装的似乎是numpy的不稳定版本。如何为PyPy获得稳定版本的numpy?

我还尝试了pip install numpy(不是pip install git+https://bitbucket.org/pypy/numpy.git

但是,我还遇到了链接PIP Install Numpy throws an error "ascii codec can't decode byte 0xe2"

中讨论的另一个问题

答案是使用apt-get来安装numpy但是,这个答案仅适用于CPython。 PyPy有一个很好的解决方案吗?

1 个答案:

答案 0 :(得分:3)

我刚刚下载了Pypy 2.4及其numpy(通过git安装)。看起来ufunc功能有错误或只是不完整。

x = numpy.arange(10)
x.sum()  # 45
x.min()  # 0
numpy.min(x)  # TypeError: expected integer, got NoneType object
numpy.sum(x)  # same error

但是,如果我给它out属性这些ufunc个版本有效(sortof)

numpy.sum(x, out=1)  # returns 45
numpy.min(x, out=1)  # returns 0
numpy.min(x, out=None)  # gets the above error

但它不会在out参数

中返回值
y = 0
numpy.sum(x, out=y)  # returns 45, but does not change y

常规numpy会反对y不是数组(或具有错误的维度)。


np.min(x)np.core.umath.minimum.reduce(x,None,None,None)相同,其中reduce参数为(variable, axis, dtype, out)np.core.umath.minimum.reduce(x)工作正常。

np.core.umath.add.accumulateout参数一样正常工作,因此问题似乎与reduce隔离开来。

如果使用git clone安装,则可以在计算机上获得完整的存储库,您可以浏览该存储库。该信息也可在线获取。我还在试图找出ufunc reduce定义的位置,以及它是否完全正常运行。该模块仍处于开发阶段。


http://buildbot.pypy.org/numpy-status/latest.html是一个numpy状态表。它引用了一个pypy/module/micronumpy目录。我还没弄明白这与https://bitbucket.org/pypy/numpy.git存储库(在下载页面上)有何关联。我可以在ufunc.reduce树中找到micronumpy代码,但不能在numpy.git树中找到。


core/_methods.py中,sum被定义为对add.reduce的调用。同样地minmax。关键字参数成为位置参数。

def _sum(a, axis=None, dtype=None, out=None, keepdims=False):
    return um.add.reduce(a, axis, dtype, out, keepdims)

但看起来这些参数的顺序是错误的。 out是第4位,但当我直接尝试add.reduce时,我必须排第6位。

>>>> x
array([[ 0.,  1.],
       [ 2.,  3.],
       [ 4.,  5.]])
>>>> y=np.zeros((2,))
>>>> np.add.reduce(x, 0, float, False, False, y)
array([ 6.,  9.])
# reduce(a, axis, dtype, ?, keepdims, out)

我顺便看到commit树中有micronumpy处理reduce的错误参数顺序。这可能正在解决这个错误。

常规numpy sum来电是:

um.add.reduce(a, axis=axis, dtype=dtype, out=out, keepdims=keepdims)

工作正常。显然有人试图通过最小化关键字参数来挤出一些性能。

module/micronumpy/ufuncs.pyreduce定义为:

reduce(self, space, w_obj, w_axis, keepdims=False, out=None, dtype=None,
    cumulative=False)