【问题标题】:How can I select n items and skip m from ndarray in python?如何在 python 中选择 n 个项目并从 ndarray 中跳过 m?
【发布时间】:2016-02-21 10:26:15
【问题描述】:

假设我有一个包含 100 个元素的 ndarray,我想选择前 4 个元素,跳过 6 个并像这样继续(换句话说,每 10 个元素选择前 4 个元素)。

我尝试使用带有 step 的 python 切片,但我认为它不适用于我的情况。我怎样才能做到这一点?我正在使用 Pandas 和 numpy,他们可以帮忙吗?我四处寻找,但我没有找到像那种切片这样的东西。谢谢!

【问题讨论】:

  • 输入ndarray的形状?您要沿哪个轴进行此选择?
  • 我的 ndarray X 的形状为 (100,1),因为我重新塑造了它,以便使用这些点和 y ndarray 来用 pyplot 绘制图表。但我只想每 10 个绘制前 4 个元素。

标签: python numpy multidimensional-array slice


【解决方案1】:

在 OP 中的示例中,输入数组可以被m+n 整除。如果不是,那么您可以使用下面的函数take_n_skip_m。它通过填充输入数组来扩展@Divakar 的答案,使其可重塑为适当的二维矩阵;切片,展平并再次切片以获得所需的结果:

def take_n_skip_m(arr, n=4, m=6):
    # in case len(arr) is not divisible by (n+m), get the remainder
    remainder = len(arr) % (n+m)
    # will pad arr with (n+m-remainder) 0s at the back
    pad_size = (0, n+m-remainder)
    # pad arr; reshape to create 2D array; take first n of each row; flatten 2D->1D
    sliced_arr = np.pad(arr, pad_size).reshape(-1, n+m)[:, :n].flatten()
    # remove any remaining padding constant if there is any (which depends on whether remainder >= n or not)
    return sliced_arr if remainder >= n else sliced_arr[:remainder-n]

例子:

>>> out = take_n_skip_m(np.arange(20), n=5, m=4)
>>> print(out)
[ 0  1  2  3  4  9 10 11 12 13 18 19]

>>> out = take_n_skip_m(np.arange(20), n=5, m=6)
>>> print(out)
[ 0  1  2  3  4 11 12 13 14 15]

【讨论】:

    【解决方案2】:

    您可以使用NumPy slicing 来解决您的问题。

    对于1D 数组案例 -

    A.reshape(-1,10)[:,:4].reshape(-1)
    

    这可以扩展到2D 数组情况,选择沿第一轴进行 -

    A.reshape(-1,10,A.shape[1])[:,:4].reshape(-1,A.shape[1])
    

    【讨论】:

      【解决方案3】:

      您可以将数组重新整形为10x10,然后使用切片来选取每行的前 4 个元素。然后展平重塑后的切片数组:

      In [46]: print a
      [ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
       25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
       50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
       75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99]
      
      In [47]: print a.reshape((10,-1))[:,:4].flatten()
      [ 0  1  2  3 10 11 12 13 20 21 22 23 30 31 32 33 40 41 42 43 50 51 52 53 60
       61 62 63 70 71 72 73 80 81 82 83 90 91 92 93]
      

      【讨论】:

        【解决方案4】:
        shorter_arr = arr[np.arange(len(arr))%10 < 4]
        

        【讨论】:

          【解决方案5】:

          使用% 10:

          print [i for i in range(100) if i % 10 in (0, 1, 2, 3)]
          
          [0, 1, 2, 3, 10, 11, 12, 13, 20, 21, 22, 23, 30, 31, 32, 33, 40, 41, 42, 43, 50, 51, 52, 53, 60, 61, 62, 63, 70, 71, 72, 73, 80, 81, 82, 83, 90, 91, 92, 93]
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-02-05
            • 2020-12-18
            • 1970-01-01
            • 1970-01-01
            • 2016-08-23
            相关资源
            最近更新 更多