【问题标题】:Is Numpy giving unexpected results?Numpy 是否给出了意想不到的结果?
【发布时间】:2018-01-18 13:25:31
【问题描述】:

我有一个数据集X,这样X.shape 会产生(10000, 9)。我想使用以下代码选择X 的子集:

X = np.asarray(np.random.normal(size = (10000,9)))
train_fraction = 0.7 # fraction of X that will be marked as train data
train_size = int(X.shape[0]*train_fraction) # fraction converted to number
test_size = X.shape[0] - train_size # remaining rows will be marked as test data
train_ind = np.asarray([False]*X.shape[0])     
train_ind[np.random.randint(low = X.shape[0], size = (train_size,))] = True # mark True at 70% of the places

问题是np.sum(train_ind) 不是 7000 的预期值。相反,它给出了 5033 等随机值。

我最初认为np.random.randint(low = X.shape[0], size = (train_size,)) 可能是罪魁祸首。但是当我做np.random.randint(low = X.shape[0], size = (train_size,)).shape 时,我得到(7000,)

我哪里出错了?

【问题讨论】:

  • 有更好的方法来初始化一个布尔 numpy 数组,看看here,我建议第二好的答案,而不是公认的。
  • @JürgMerlinSpaak 谢谢。这很有帮助。

标签: python numpy


【解决方案1】:

np.random.choice(np.arange(0,X.shape[0]), size = train_size, replace = False)

问题是,np.random.randint 不会被注入,基本上数字 1 可能会出现两次。这意味着索引 1 将被设置为 True 两次,而另一个不会被设置为 True

np.random.choice 函数确保每个数字最多出现一次(如果您设置了replace = False

【讨论】:

  • 这行得通。谢谢。你提到:'基本上数字 1 可能会出现两次。这意味着索引 1 将被设置为 True 两次'。是的,同意了。我意识到这可能是问题所在。但是当我运行我粘贴的代码并求和时,我得到的值也高于 7000。也许我应该在问题中更明确地说明这一点。您的帖子回答了为什么总和可能小于 7000 但在总和高于 7000 的情况下,发生了什么是我主要关心的问题
  • 是的,我也想知道,这有点奇怪......我声称你运行了多次train_ind[np.random.randint(low = X.shape[0], size = (train_size,))] = True 行,没有重置train_ind,我看不出还有什么这可能发生。如果不是这样,请告诉我
  • 我运行了以下代码,看看是否可以重现总和超过 7000 的情况。num_cases = 0 for i in range(10000): train_ind = np.asarray([False]*X.shape[0]) train_ind[np.random.randint(low = X.shape[0], size = (train_size,))] = True if sum(train_ind) > 7000: print(sum(train_ind)) num_cases+=1 print(num_cases) 在这个循环结束时,我得到 num_cases 为零.我想我可能在初始化train_ind 数组之前已经运行了两次赋值行。编辑了问题。谢谢
猜你喜欢
  • 2019-05-19
  • 2017-01-05
  • 2021-10-14
  • 1970-01-01
  • 1970-01-01
  • 2021-12-17
  • 2021-04-22
  • 2016-02-13
  • 2017-11-05
相关资源
最近更新 更多