我已从链接https://bitbucket.org/pypy/pypy/downloads/pypy-2.4.0-src.tar.bz2下载了PyPy便携版,并且我已使用命令pip install git+https://bitbucket.org/pypy/numpy.git
安装成功,但我无法使用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有一个很好的解决方案吗?
答案 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.accumulate
与out
参数一样正常工作,因此问题似乎与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
的调用。同样地min
和max
。关键字参数成为位置参数。
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.py
将reduce
定义为:
reduce(self, space, w_obj, w_axis, keepdims=False, out=None, dtype=None,
cumulative=False)