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