1

我需要从 2 个数组中选择 n 个项目,以使索引相同。因此,例如,我需要从 x 中随机选择两个项目,并从 y 中选择元素,以使 y 选择的索引与 x 相同:

x = np.asarray([0.1123,0.223,0.8873])
y = np.asarray([1,1,2])

x_chosen = np.random.choice(x,(2,))

x_chosen最后是:x_chosen = [0.1123,0.223]... 那么我需要:

y_chosen = [1,1]

我目前有一个解决方法......但我想要一个基本的 numpy 或 scipy 函数,而不是我自己的基本上只有 3 行的函数,以保持我在这个项目中的函数在范围内......我宁愿没有这个在我的主要代码中创建一次性变量:

x_index = np.asarray([i for i in range(len(x))])
x_chosen_indices = np.random.choice(x_index,(2,))
x_chosen = x[x_chosen_indices]
y_chosen = y[x_chosen_indices]

或者,我可以堆叠、选择和拆分......但我想这仍然会给我留下一个一次性的功能,我必须坚持在某个地方......或者 4-5 行没有意义的代码......

4

4 回答 4

2

如何首先选择指数:

import numpy as np

choice = np.random.choice(np.array(range(len(x))), 2)

然后根据他们选择:

x_chosen, y_chosen = x[choice], y[choice]
于 2016-02-26T14:36:59.597 回答
2

用于np.random.randint()查找您的索引:

x = np.asarray([0.1123,0.223,0.8873])
y = np.asarray([1,1,2])

indices = np.random.randint(0, x.size, 2)
>>> x[indices]
array([ 0.1123,  0.223 ])
>>> y[indices]
array([1, 1])

编辑

正如 B. M 在评论中提到的那样,使用np.random.choice(.., replace=False)以避免多次使用相同的索引:

indices = np.random.choice(x.size, 2, replace=False)
于 2016-02-26T14:40:56.957 回答
1

您可以使用numpy.random.permutation创建一个随机排列的索引数组。然后,您可以根据需要选择任意数量的随机选择的公共元素:

import numpy as np

x = np.asarray([0.1123,0.223,0.8873])
y = np.asarray([1,1,2])

indices= np.random.permutation(np.size(x, 0))

x_chosen = x[indices[:2]]
y_chosen = y[indices[:2]]

print(x_chosen)
>>>[ 0.8873  0.1123]
print(y_chosen)
>>>[2 1]
于 2016-02-26T14:36:01.827 回答
1

以下是我认为可能有效的两种方法。第一种与您上面的方法相同,但它确实去掉了一行:

index = np.random.choice(np.arange(len(x)), 2, replace=False)
x_chosen = x[index]
y_chosen = y[index]

In [15]: x_chosen
Out[15]: array([ 0.8873,  0.223 ])

我不确定这是否是您想要的,但它是一个单行程序,可以为您提供 (x, y) 的元组:

import random
random.sample(zip(x, y), 2)

Out[22]: [(0.223, 1), (0.1123, 1)]
于 2016-02-26T14:38:38.200 回答