删除numpy数组中的行无效

时间:2016-02-05 21:14:53

标签: python arrays numpy matrix

我正在尝试将我的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)

这显然是错误的,因为来自train和test的行数应该加起来矩阵中的总行数,但这里显然更加。任何人都可以帮我弄清楚出了什么问题吗?

2 个答案:

答案 0 :(得分:4)

因为您使用替换生成随机整数,所以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

答案 1 :(得分:3)

为什么不使用scikit学习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)