2017-01-17 34 views
3

列出的名單,我想創建一個玩具訓練從XOR功能設置:獲取{} ValueError錯誤「A」必須爲1 - dimensoinal從np.random.choice

xor = [[0, 0, 0], 
     [0, 1, 1], 
     [1, 0, 1], 
     [1, 1, 0]] 

input_x = np.random.choice(a=xor, size=200) 

然而,這是給我

{ValueError} 'a' must be 1-dimensoinal 

但是,如果我加上eg一個數字到這個清單:

xor = [[0, 0, 0], 
     [0, 1, 1], 
     [1, 0, 1], 
     [1, 1, 0], 
     1337]  # With this it will work 

input_x = np.random.choice(a=xor, size=200) 

它開始工作。爲什麼會出現這種情況,如何在不需要向xor列表中添加另一個基元的情況下如何進行此項工作?

+2

你從'np.random.choice期望(A = XOR,大小= 200 )'單個數字還是具有3個值的數組? – BloodyD

+0

@BloodyD我期望從'xor'中有200個隨機抽取樣本的列表。 – displayname

+3

爲什麼不直接使用'random.choice'呢?因爲你已經在使用Python的列表。 –

回答

4

在一個陣列的情況下,我會做到以下幾點:

xor = np.array([[0,0,0], 
     [0,1,1], 
     [1,0,1], 
     [1,1,0]]) 
indices = np.arange(len(xor)) 
rnd_indices = np.random.choice(indices, size=200) 

xor_data = xor[rnd_indices] 
+0

嗯,我想我必須走這條路:D謝謝:) – displayname

+1

你也可以優化代碼,正如其他人提出的'np.random.choice(len(xor),size = 200)';) – BloodyD

2

如果你想要一個xor的隨機列表,你應該這樣做。

xor[np.random.choice(len(xor),1)] 
1

有趣!似乎numpy首先隱式地將輸入轉換爲np.array。所以,你的第一個輸入

np.array(xor).shape == (4, 3) 

而對於第二個值

np.array(xor).shape == (5,) 

因此,第二值由numpy的一維見過!

所以,選擇一個隨機行,隨便挑一個隨機指數,然後將相應的行

ind = np.choice(len(xor)) 
random_row = xor[ind, :] 
+0

是的,numpy會嘗試識別數組中的值的公共數據類型。在第一種情況下,這是'int',但在第二種情況下它只是'object',因爲它比較了同一維中的對象。因此,你得到了一個dtype'object'的數組和第二個值爲 – BloodyD

+0

的形狀'(5,)',這很好的解釋。你記得在文檔(或任何其他來源)中提到的位置嗎? numpy文檔有點稀疏...... –

+0

我不知道,這裏的文檔在哪裏,但我自己面對過幾次。 *編輯*短谷歌搜索:https://docs.scipy.org/doc/numpy/reference/generated/numpy.array.html#numpy.array「[...] dtype:數據類型,可選 所需的數據如果沒有給出**,那麼類型將被確定爲保持序列中對象所需的最小類型[...]「 – BloodyD

1

可以使用random包代替:對性能

import random 
input_x = [random.choice(xor) for _ in range(200)] 
+1

我不認爲你想轉置' xor'。 – Goyo

+0

我假設樣本是4個元素。但我會更新答案,謝謝! –

0

有了焦點,我們可以使用這四個數字的十進制數等價物,將這些數字提供給np.random.choice()以生成200這些隨機選擇的數字,最後通過位移操作獲得它們的二進制等值。

因此,實現將是 -

def bitshift_approach(N): 
    nums = np.random.choice(np.array([0,3,5,6]),size=(N)) 
    return ((nums & (1 << np.arange(3))[:,None])!=0).T.astype(int) 

另一種方法是使用非常相似,其他人建議使用np.random.choice(len(xor)生成行索引,然後使用row-indexing選擇rows關閉xor。稍作修改就是使用np.take來選擇這些行。有了這樣的重複指數,就像這裏的情況一樣,這應該是高性能的。

因此,另一種方法是 -

np.take(xor,np.random.choice(len(xor), size=N)) 

運行測試 -

In [42]: N = 200 

In [43]: %timeit xor[np.random.choice(np.arange(len(xor)), size=N)] 
    ...: %timeit xor[np.random.choice(len(xor), size=N)] 
    ...: %timeit bitshift_approach(N) 
    ...: %timeit np.take(xor,np.random.choice(len(xor), size=N)) 
    ...: 
10000 loops, best of 3: 43.3 µs per loop 
10000 loops, best of 3: 38.3 µs per loop 
10000 loops, best of 3: 59.4 µs per loop 
10000 loops, best of 3: 35 µs per loop 

In [44]: N = 1000 

In [45]: %timeit xor[np.random.choice(np.arange(len(xor)), size=N)] 
    ...: %timeit xor[np.random.choice(len(xor), size=N)] 
    ...: %timeit bitshift_approach(N) 
    ...: %timeit np.take(xor,np.random.choice(len(xor), size=N)) 
    ...: 
10000 loops, best of 3: 69.5 µs per loop 
10000 loops, best of 3: 64.7 µs per loop 
10000 loops, best of 3: 77.7 µs per loop 
10000 loops, best of 3: 38.7 µs per loop 

In [46]: N = 10000 

In [47]: %timeit xor[np.random.choice(np.arange(len(xor)), size=N)] 
    ...: %timeit xor[np.random.choice(len(xor), size=N)] 
    ...: %timeit bitshift_approach(N) 
    ...: %timeit np.take(xor,np.random.choice(len(xor), size=N)) 
    ...: 
1000 loops, best of 3: 363 µs per loop 
1000 loops, best of 3: 351 µs per loop 
1000 loops, best of 3: 225 µs per loop 
10000 loops, best of 3: 134 µs per loop 
相關問題