有没有办法查看numpy上某个函数的源代码?

时间:2019-02-07 07:51:47

标签: python numpy

有没有一种方法可以更好地理解函数背后的逻辑,而不仅仅是使用它/尝试执行错误或引用文档?例如tolist()

我在Google上进行搜索,没有找到可以参考或重新创建的源代码。我想了解某些功能的基本构建块。还是了解第三方功能/软件包的更好建议?

3 个答案:

答案 0 :(得分:3)

Andrew Bowling是对的,源代码在github.com/numpy/numpy上。但是,有更简单的方法。

例如,假设我要查找numpy.cumsum的实现:

  1. Google。您会发现documentation page
  2. 单击文档页面上的[source]
  3. 请记住,实现可能比阅读文档更复杂。大部分用编写。

另一种方法是克隆存储库并使用grep

$ grep -rnil "cumsum" * --exclude-dir=doc/ --exclude-dir=benchmarks/
numpy/random/mtrand/mtrand.pyx
numpy/lib/recfunctions.py
numpy/lib/_iotools.py
numpy/lib/shape_base.py
numpy/lib/histograms.py
numpy/lib/arraysetops.py
numpy/lib/function_base.py
numpy/lib/nanfunctions.py
numpy/lib/tests/test_function_base.py
numpy/lib/tests/test_nanfunctions.py
numpy/lib/info.py
numpy/matrixlib/tests/test_interaction.py
numpy/core/include/numpy/ufuncobject.h
numpy/core/src/multiarray/methods.c
numpy/core/src/multiarray/calculation.c
numpy/core/src/multiarray/calculation.h
numpy/core/src/multiarray/scalartypes.c.src
numpy/core/src/umath/_umath_tests.c.src
numpy/core/fromnumeric.py
numpy/core/code_generators/numpy_api.py
numpy/core/tests/test_ufunc.py
numpy/core/tests/test_regression.py
numpy/core/info.py
numpy/core/_add_newdocs.py
numpy/ma/core.py
numpy/ma/API_CHANGES.txt
numpy/ma/README.txt
numpy/ma/tests/test_core.py
numpy/ma/tests/test_old_ma.py

但是请:如果您是初学者,但在文档中找不到解释-请问一下。那是更快的方式。举例说明什么使您感到困惑,并努力解决这个问题。仅当您的问题非常特定并且在numpy / scipy上出现StackOverflow / Github问题无济于事时,检查numpy的实现才是值得的。 numpy / scipy社区非常好。

答案 1 :(得分:2)

我相信Numpy Github repository有很多源代码。

答案 2 :(得分:0)

使用inspect库:

>>> import inspect
>>> print(inspect.getsource(np.cumsum))
def cumsum(a, axis=None, dtype=None, out=None):
    """
    Return the cumulative sum of the elements along a given axis.

    Parameters
    ----------
    a : array_like
        Input array.
    axis : int, optional
        Axis along which the cumulative sum is computed. The default
        (None) is to compute the cumsum over the flattened array.
    dtype : dtype, optional
        Type of the returned array and of the accumulator in which the
        elements are summed.  If `dtype` is not specified, it defaults
        to the dtype of `a`, unless `a` has an integer dtype with a
        precision less than that of the default platform integer.  In
        that case, the default platform integer is used.
    out : ndarray, optional
        Alternative output array in which to place the result. It must
        have the same shape and buffer length as the expected output
        but the type will be cast if necessary. See `doc.ufuncs`
        (Section "Output arguments") for more details.

    Returns
    -------
    cumsum_along_axis : ndarray.
        A new array holding the result is returned unless `out` is
        specified, in which case a reference to `out` is returned. The
        result has the same size as `a`, and the same shape as `a` if
        `axis` is not None or `a` is a 1-d array.


    See Also
    --------
    sum : Sum array elements.

    trapz : Integration of array values using the composite trapezoidal rule.

    diff :  Calculate the n-th discrete difference along given axis.

    Notes
    -----
    Arithmetic is modular when using integer types, and no error is
    raised on overflow.

    Examples
    --------
    >>> a = np.array([[1,2,3], [4,5,6]])
    >>> a
    array([[1, 2, 3],
           [4, 5, 6]])
    >>> np.cumsum(a)
    array([ 1,  3,  6, 10, 15, 21])
    >>> np.cumsum(a, dtype=float)     # specifies type of output value(s)
    array([  1.,   3.,   6.,  10.,  15.,  21.])

    >>> np.cumsum(a,axis=0)      # sum over rows for each of the 3 columns
    array([[1, 2, 3],
           [5, 7, 9]])
    >>> np.cumsum(a,axis=1)      # sum over columns for each of the 2 rows
    array([[ 1,  3,  6],
           [ 4,  9, 15]])

    """
    try:
        cumsum = a.cumsum
    except AttributeError:
        return _wrapit(a, 'cumsum', axis, dtype, out)
    return cumsum(axis, dtype, out)

>>> 

但是仅适用于numpy中的函数,您可以执行tolist,因为它是子函数,也就是说,它是np.array.tolist,而不仅仅是{{1} },我以np.tolist为例。