从循环中的矩阵中选择批处理

时间:2017-11-01 22:39:22

标签: python-2.7 numpy

假设我有以下矩阵:

X = np.array([[1,2,3], [4,5,6], [7,8,9], [70,80,90], [45,43,68], [112,87,245]])

我想在每个时间循环中绘制一批2个随机行,并将其发送到函数。例如,迭代i中的批处理可以是batch = [[4,5,6], [70,80,90]]

我执行以下操作:

X = np.array([[1,2,3], [4,5,6], [7,8,9], [70,80,90], [45,43,68], [112,87,245]])

def caclulate_batch(batch):
    pass


for i in range(X.shape[0]/2):
    batch = np.array([])
    for _ in range(2):
        r = random.randint(0, 5)
        batch = np.append(batch, X[r])
    caclulate_batch(batch)

这里有两个问题:(1)它返回附加数组(2)可以重复随机数,可以多次选择同一行。如何修改代码以满足我的要求。

2 个答案:

答案 0 :(得分:1)

r = np.random.randint(0, len(x), 2)应该为你提供指数。这允许您使用花式索引来获取子集:batch = x[r, :]

如果您希望沿着新维度累积数组,就像您的循环一样,请使用np.stacknp.block代替np.append

答案 1 :(得分:1)

(1)您可以使用numpy.stack代替append。编辑:但是当您在列表中包含所有批次时,将调用此函数:

list = ([1,2], [3,4]) 
numpy.stack(list)
# gives [[1,2],
#        [3,4]]

(2)你可以随机播放X数组,遍历结果并逐两提取。看numpy.random.shuffle

看起来像那样:

S = np.random.shuffle(X)

for i in range(S.shape[0]/2):
    batch = S[i*2:i*2+1]
    caclulate_batch(batch)