将嵌套列表合并为列表元组列表中的组

时间:2018-12-29 19:13:36

标签: python python-3.x list neural-network list-comprehension

我有一个大小为50000的列表。说a。每个元素都是一个元组,例如b=a[0]。每个元组包含2个列表,例如c=b[0], d=b[1]。第一个列表,即c的长度为784,第二个列表,即d的长度为10。 从此列表中,我需要提取以下内容:
对列表a的前10个元素进行分组。从这10个元组中,提取它们的第一个元素(c)并将其放在大小为784x10的矩阵中。还提取元组的第二个元素,并将它们放在大小为10x10的另一个矩阵中。对列表a中的每10个元素重复此操作。
使用列表理解可以在一行中完成吗?还是我必须编写多个for循环?哪种方法最有效? 注意:如果我以列表或numpy.ndarray矩阵的形式可以。

其他信息:我正在关注this神经网络教程,该教程旨在设计一个可以识别手写数字的神经网络。 MNIST数据库用于训练网络。训练数据为上述格式。我需要为每个mini_batch创建一个input_images和Expected_output矩阵。

这是我尝试过的代码。我正在获取大小为50000的列表。它没有分成mini_batches

f = gzip.open('mnist.pkl.gz', 'rb')
tr_d, va_d, te_d = pickle.load(f, encoding='latin1')
f.close()
training_inputs = [numpy.reshape(x, (784, 1)) for x in tr_d[0]]
training_results = [vectorized_result(y) for y in tr_d[1]]
training_data = zip(training_inputs, training_results)

# training_data is a list of size 50000 as described above
n = len(training_data)  # n=50000
mini_batch_size = 10
mini_batch = [x[0] for k in range(0, n, mini_batch_size) for x in training_data[k:k+mini_batch_size]]

mnist.pkl.gz可用here

1 个答案:

答案 0 :(得分:1)

我在添加源代码之前就写了我的答案,因此它完全基于您用文字写出来的第一部分。因此,就输入大小的变化而言,它不是很安全。如果您进一步阅读《安德斯·尼尔森》一书,则实际上提供了自己的实现。

我的主要答案不是单行答案,因为这会混淆它的作用,因此我建议您编写类似这样的复杂流程,以便您更好地了解实际发生的情况。在我的代码中,我创建了一个firstMatrix(包含一个矩阵中的c元素)和一个secondMatrix(包含d元素)。我每10个批次执行一次此操作,但是之后不知道您要对矩阵执行什么操作,因此我只对每个批次进行处理。如果您想对它们进行分组或其他内容,请这样说,我将尝试实现。

for batch in np.array_split(a,10):
    firstMatrix = np.zeros(shape=(784,10))
    secondMatrix = np.zeros(shape=(10,10))
    for i in range(len(batch)):
        firstMatrix[:,i] = batch[i][0]
        secondMatrix[:,i] = batch[i][1]

如果您真的想要一个内衬,则可以使用以下方法对firstMatrices进行排列,并为secondMatrices进行排列:

firstMatrices = [np.array([batch[i][0] for i in range(len(batch))]).T for batch in np.array_split(a,10)]
secondMatrices = [np.array([batch[i][1] for i in range(len(batch))]).T for batch in np.array_split(a,10)]