【问题标题】:Deleting rows from numpy array not working从numpy数组中删除行不起作用
【发布时间】:2016-02-05 21:14:53
【问题描述】:

我正在尝试将我的 numpy 数据点数组拆分为测试集和训练集。为此,我从数组中随机选择行作为训练集,其余为测试集。

这是我的代码:

matrix = numpy.loadtxt("matrix_vals.data", delimiter=',', dtype=float)
matrix_rows, matrix_cols = matrix.shape

# training set 
randvals = numpy.random.randint(matrix_rows, size=50)
train = matrix[randvals,:]
test = numpy.delete(matrix, randvals, 0)

print matrix.shape
print train.shape
print test.shape

但我得到的输出是:

matrix.shape: (130, 14)
train.shape: (50, 14)
test.shape: (89, 14)

这显然是错误的,因为训练和测试的行数应该加起来矩阵中的总行数但这里显然更多。谁能帮我弄清楚出了什么问题?

【问题讨论】:

    标签: python arrays numpy matrix


    【解决方案1】:

    因为您正在生成随机整数替换randvals 几乎肯定会包含重复索引。

    使用重复索引进行索引将多次返回同一行,因此matrix[randvals, :] 保证为您提供正好 50 行的输出,无论其中一些是否重复。

    相比之下,np.delete(matrix, randvals, 0) 只会删除 唯一 行索引,因此它只会将行数减少 randvals 中唯一值的数量。

    尝试比较:

    print(np.unique(randvals).shape[0] == matrix_rows - test.shape[0])
    # True
    

    要生成 唯一 介于 0 和 1 - matrix_rows 之间的随机索引向量,您可以使用 np.random.choicereplace=False

    uidx = np.random.choice(matrix_rows, size=50, replace=False)
    

    然后matrix[uidx].shape[0] + np.delete(matrix, uidx, 0).shape[0] == matrix_rows

    【讨论】:

    • 谢谢!这正是问题所在
    【解决方案2】:

    为什么不使用 scikit learn 的 train_test_split 函数来避免所有麻烦?

    import numpy as np
    from sklearn.cross_validation import train_test_split
    
    train, test = train_test_split(mat, test_size = 50.0/130.0)
    

    【讨论】:

    • 这会给我随机拆分吗?编辑:刚刚检查了文档,它确实如此!感谢您提供替代解决方案!我不知道这个功能。我仍然想知道为什么我的代码不起作用
    • 是的。如果你愿意,你可以自己测试一下。查看我上面答案中链接上的文档,了解它是如何工作的以及它需要什么参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    • 2020-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多