【问题标题】:Delete rows at select indexes from a numpy array从 numpy 数组中删除选择索引处的行
【发布时间】:2015-05-20 05:01:59
【问题描述】:

在我的数据集中,我已经接近 200 行,但是对于最小的工作,例如,让我们假设以下数组:

arr = np.array([[1,2,3,4], [5,6,7,8], 
               [9,10,11,12], [13,14,15,16], 
               [17,18,19,20], [21,22,23,24]])

我可以对其中的 3 行进行随机抽样,如下所示:

indexes = np.random.choice(np.arange(arr.shape[0]), int(arr.shape[0]/2), replace=False)

使用这些索引,我可以选择我的测试用例如下:

testing = arr[indexes]

我想删除这些索引处的行,我可以将剩余的元素用于我的训练集。

here 的帖子看来,training = np.delete(arr, indexes) 应该这样做。但我得到了一维数组。

我也尝试了使用training = arr[indexes.astype(np.bool)] 的建议here,但它没有给出清晰的分离。我在训练和测试集中都得到了元素 [5,6,7,8]。

training = arr[indexes.astype(np.bool)]

testing
Out[101]: 
array([[13, 14, 15, 16],
       [ 5,  6,  7,  8],
       [17, 18, 19, 20]])

training
Out[102]: 
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12]])

知道我做错了什么吗?谢谢。

【问题讨论】:

标签: python arrays numpy


【解决方案1】:

从 numpy 数组中删除索引行:

arr = np.delete(arr, indexes, axis=0)

【讨论】:

    【解决方案2】:

    一种方法是使用 np.setdiff1d 获取剩余的行索引,然后使用这些行索引来获得所需的输出 -

    out = arr[np.setdiff1d(np.arange(arr.shape[0]), indexes)]
    

    或使用np.in1d 来利用boolean indexing -

    out = arr[~np.in1d(np.arange(arr.shape[0]), indexes)]
    

    【讨论】:

    • 我不知道,但这在 np.delete() 上对我有用。我有一个矩阵(1000,17),并且希望在每次迭代中使用除一行之外的所有行。删除命令有时会给我 998 和 999 作为我的输出长度,而不是每次都给我 999。我认为这是一个四舍五入的错误——而且比较的结果不够好,但事实并非如此。我对 python 的了解还不够,无法知道为什么 delete 很不幸地不起作用。
    猜你喜欢
    • 1970-01-01
    • 2014-04-21
    • 2019-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-27
    • 2018-08-26
    相关资源
    最近更新 更多