获取真/假数组len的掩码

时间:2019-09-20 17:15:43

标签: python numpy

此代码有效:

all_historic_data = pd.DataFrame()

percent_of_data = 0.8
#create train and test sets
#this methodology will randomly select percent_of_data of our data

msk = np.random.rand(len(all_historic_data)) < percent_of_data
train = all_historic_data[msk]
test = all_historic_data[~msk]

但是,如果我不想使用随机数,请尝试以下操作:

msk = range(len(all_historic_data)) < percent_of_data

我得到一个错误:

TypeError: '<' not supported between instances of 'range' and 'float'

如何获得固定的array,其中TrueFalse之比的条目数正好是percent_of_data

1 个答案:

答案 0 :(得分:1)

我将假设all_historic_data是一个向量。

如果每次只想完全获得相同的结果,则一种可能的解决方案是设置种子,因此,“随机”生成的数字实际上将始终相同。您可以按照以下步骤进行操作:

np.random.seed(10) # write any number you like
a = np.random.rand(100)
np.random.seed(10) # write any number you like
b = np.random.rand(100)
print(a == b)

设置种子后,它的“随机”部分消失了-您将始终获得相同的数字。

实际上,输出为:

[ True  True  True  True  True  True  True  True  True  True  True  True
  True  True  True  True  True  True  True  True  True  True  True  True
  True  True  True  True  True  True  True  True  True  True  True  True
  True  True  True  True  True  True  True  True  True  True  True  True
  True  True  True  True  True  True  True  True  True  True  True  True
  True  True  True  True  True  True  True  True  True  True  True  True
  True  True  True  True  True  True  True  True  True  True  True  True
  True  True  True  True  True  True  True  True  True  True  True  True
  True  True  True  True]

NB:len(all_historic_data)是一个整数,因此range(len(all_historic_data))是一个范围对象,其值分别为0、1,...,len(all_historic_data)-1。例如,如果运行

for i in range(10):
    print(i)

然后,输出将为

0
1
2
3
4
5
6
7
8
9

因此,您可以注意到所有这些数字(第一个数字除外)将小于0.8。如果您使用它来制作火车,那么火车中将只有一个观测值。

如果您仍然想将范围对象中的数字与浮点数进行比较,则如@Dan所述,使用np.arange可能会有所帮助。