2016-02-26 62 views
1

我需要從2個數組中選擇n個項目,以使索引相同。所以,舉例來說,我需要選擇從X隨機兩個項目,並選擇從y中如:Y的選民指數是相同的X的元素:Numpy從2個數組中選擇元素

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代碼行將沒有任何意義...

回答

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) 
+1

有時你會選擇兩次相同的元素。 –

+0

'choice()'也是如此:'np.random.choice(10,3)' - >'array([3,0,3] )' –

+0

你可以避免使用np.random.choice(len(x),2,replace = False)。 –

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] 
+1

不錯!謝啦。 – bordeo

2

如何第一選擇指數:

import numpy as np 

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

,然後選擇按起來:

x_chosen, y_chosen = x[choice], y[choice] 
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)] 
相關問題