numpy导包出错笔记

最进在跑其它人写的代码时遇到一个导包的问题,运行numpy中的文件时出现ImportError:cannot import name "_validate_lengths"

出现问题的原因是,新版那本的numpy好像移除了对应的模块。解决的方法可以有两种,降低numpy的版本,在终端或命令提示符下执行: pip uninstall numpy 卸载原来的版本,再执行: pip install numpy==1.13.0。第二种方法就是找到对应目录下的文件增加该函数:即找到你安装的环境下的文件‘’C:\ProgramData\Anaconda3\Lib\site-packages\numpy\lib\arraypad.py中第954行添加以下代码:

def _normalize_shape(ndarray, shape, cast_to_int=True):
    """
    Private function which does some checks and normalizes the possibly
    much simpler representations of ‘pad_width‘, ‘stat_length‘,
    ‘constant_values‘, ‘end_values‘.
    Parameters
    ----------
    narray : ndarray
        Input ndarray
    shape : {sequence, array_like, float, int}, optional
        The width of padding (pad_width), the number of elements on the
        edge of the narray used for statistics (stat_length), the constant
        value(s) to use when filling padded regions (constant_values), or the
        endpoint target(s) for linear ramps (end_values).
        ((before_1, after_1), ... (before_N, after_N)) unique number of
        elements for each axis where `N` is rank of `narray`.
        ((before, after),) yields same before and after constants for each
        axis.
        (constant,) or val is a shortcut for before = after = constant for
        all axes.
    cast_to_int : bool, optional
        Controls if values in ``shape`` will be rounded and cast to int
        before being returned.
    Returns
    -------
    normalized_shape : tuple of tuples
        val                               => ((val, val), (val, val), ...)
        [[val1, val2], [val3, val4], ...] => ((val1, val2), (val3, val4), ...)
        ((val1, val2), (val3, val4), ...) => no change
        [[val1, val2], ]                  => ((val1, val2), (val1, val2), ...)
        ((val1, val2), )                  => ((val1, val2), (val1, val2), ...)
        [[val ,     ], ]                  => ((val, val), (val, val), ...)
        ((val ,     ), )                  => ((val, val), (val, val), ...)
    """
    ndims = ndarray.ndim
    # Shortcut shape=None
    if shape is None:
        return ((None, None), ) * ndims
    # Convert any input `info` to a NumPy array
    shape_arr = np.asarray(shape)
    try:
        shape_arr = np.broadcast_to(shape_arr, (ndims, 2))
    except ValueError:
        fmt = "Unable to create correctly shaped tuple from %s"
        raise ValueError(fmt % (shape,))
    # Cast if necessary
    if cast_to_int is True:
        shape_arr = np.round(shape_arr).astype(int)
    # Convert list of lists to tuple of tuples
    return tuple(tuple(axis) for axis in shape_arr.tolist())
 
def _validate_lengths(narray, number_elements):
    """
    Private function which does some checks and reformats pad_width and
    stat_length using _normalize_shape.
    Parameters
    ----------
    narray : ndarray
        Input ndarray
    number_elements : {sequence, int}, optional
        The width of padding (pad_width) or the number of elements on the edge
        of the narray used for statistics (stat_length).
        ((before_1, after_1), ... (before_N, after_N)) unique number of
        elements for each axis.
        ((before, after),) yields same before and after constants for each
        axis.
        (constant,) or int is a shortcut for before = after = constant for all
        axes.
    Returns
    -------
    _validate_lengths : tuple of tuples
        int                               => ((int, int), (int, int), ...)
        [[int1, int2], [int3, int4], ...] => ((int1, int2), (int3, int4), ...)
        ((int1, int2), (int3, int4), ...) => no change
        [[int1, int2], ]                  => ((int1, int2), (int1, int2), ...)
        ((int1, int2), )                  => ((int1, int2), (int1, int2), ...)
        [[int ,     ], ]                  => ((int, int), (int, int), ...)
        ((int ,     ), )                  => ((int, int), (int, int), ...)
    """
    normshp = _normalize_shape(narray, number_elements)
    for i in normshp:
        chk = [1 if x is None else x for x in i]
        chk = [1 if x >= 0 else -1 for x in chk]
        if (chk[0] < 0) or (chk[1] < 0):
            fmt = "%s cannot contain negative values."
            raise ValueError(fmt % (number_elements,))
    return normshp

在Linux下如果出现这类错误解决起来麻烦些,同样可以用降级的方法的方法,把numpy回到1.15.0版本或以前的版本均可。但是这样做往往和其它调用的库会冲突,如笔者这里安装了mxnet,mxnet需要安装的numpy版本是在1.16.0之后的。笔者是在执行import skimage时遇到的问题,为了解决这个问题我们可以尝试提升skimage的版本。在终端上执行: pip install --upgrade scikit-image。就不需要调用上面那个函数了。

你可能感兴趣的:(代码笔记)