代码之家  ›  专栏  ›  技术社区  ›  eigen_enthused

带余数抛出错误的Numpy整形

  •  0
  • eigen_enthused  · 技术社区  · 7 年前

    如何将此数组划分为长度为3的数组,并使用填充或未添加的余数(无所谓)

    >>>

    值错误:无法将大小为11的数组重塑为形状(3,newaxis)

    1 回复  |  直到 6 年前
        1
  •  2
  •   Joseph Konan    7 年前
    ### Two Examples Without Padding
    
    x = np.array([0,1,2,3,4,5,6,7,8,9,10])
    desired_length = 3
    num_splits = np.ceil(x.shape[0]/desired_length)
    
    print(np.array_split(x, num_splits))
    
    # Prints:
    # [array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8]), array([ 9, 10])]
    
    x = np.arange(13)
    desired_length = 3
    num_splits = np.ceil(x.shape[0]/desired_length)
    
    print(np.array_split(x, num_splits))
    
    # Prints:
    # [array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8]), array([ 9, 10]), array([11, 12])]
    
    ### One Example With Padding
    
    x = np.arange(13)
    desired_length = 3
    padding = int(num_splits*desired_length - x.shape[0])
    x_pad = np.pad(x, (0,padding), 'constant', constant_values=0)
    
    print(np.split(x_pad, num_splits))
    
    # Prints:
    # [array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8]), array([ 9, 10, 11]), array([12,  0,  0])]
    
        2
  •  1
  •   kwinkunks    7 年前

    如果要避免用零填充,最优雅的方法可能是在列表理解中切片:

    >>> import numpy as np
    >>> x = np.arange(11)
    >>> [x[i:i+3] for i in range(0, x.size, 3)]
    [array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8]), array([ 9, 10])]
    
        3
  •  0
  •   kwinkunks    7 年前

    如果你想用零填充, ndarray.resize() 这样做是为了您,但您必须自己计算出预期数组的大小:

    import numpy as np
    
    x = np.array([0,1,2,3,4,5,6,7,8,9,10])
    
    cols = 3
    rows = np.ceil(x.size / cols).astype(int)
    
    x.resize((rows, cols))
    print(x)
    

    结果是:

    [[ 0  1  2]
     [ 3  4  5]
     [ 6  7  8]
     [ 9 10  0]]
    

    据我所知,这比列表理解方法快数百倍(见我的另一个答案)。

    注意如果你做了什么 x 在调整大小之前,您可能会遇到“引用”问题。要么继续工作 x.copy() 或通过 refcheck=False resize() .