对于来自np.random.choice的列表列表,获取{ValueError}'a'必须是1-dimensionaloinal

时间:2017-01-17 13:20:39

标签: python numpy

我想从XOR功能创建一个玩具训练集:

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

但是,如果我添加例如这个列表中的一个数字:

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列表的情况下完成此工作?

5 个答案:

答案 0 :(得分:6)

如果是数组,我会执行以下操作:

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]

答案 1 :(得分:3)

如果你想要xor的随机列表,你可能应该这样做。

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

答案 2 :(得分:2)

有趣!!似乎numpy首先隐式地将输入转换为np.array。所以,第一次输入

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

而第二个值

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

所以,第二个值被numpy视为1d !!!

所以,要选择一个随机行,只需选择一个随机索引,然后选择相应的行

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

答案 3 :(得分:2)

您可以改为使用random包:

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

答案 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