使用Array.map省略F#中数组的第一个元素

时间:2012-06-06 14:48:40

标签: f#

我刚开始玩F#,所以这个问题可能很基本......

我想逐行读取文本文件,然后忽略第一行并使用给定函数处理其他行。所以我在考虑使用以下内容:

File.ReadAllLines(path)
|> Array.(ignore first element)
|> Array.map processLine

什么是一种优雅而有效的方法来实现它?

3 个答案:

答案 0 :(得分:9)

没有简单的函数可以跳过数组中的第一行,因为操作效率不高(它必须复制整个数组),但如果使用惰性序列,则可以轻松完成:

File.ReadAllLines(path) 
|> Seq.skip 1
|> Seq.map processLine

如果您需要数组中的结果(而不是seq<'T>,这是IEnumerable<'T>的F#别名),那么您可以将Seq.toArray添加到结尾。但是,如果您只是想稍后迭代这些行,那么您可能只是使用序列。

答案 1 :(得分:2)

这是Tomas回答的补充,我通常同意这一点。需要注意的一件事是,如果您的数组或序列不包含任何行,会发生什么。 (或者比您想要跳过的行少。)在这种情况下,Seq.skip将抛出异常。我能想到的最简洁的方法是:

System.IO.File.ReadAllLines fileName
|> Seq.mapi (fun i elem -> i, elem)
|> Seq.choose (fun (i, elem) -> if i > 0 then Some(elem) else None)

答案 2 :(得分:0)

您只需def train_neural_network_and_make_prediction(train_X, test_X): model = neural_network_model(x) cost = tf.reduce_mean( tf.nn.softmax_cross_entropy_with_logits(model, y) ) optimizer = tf.train.AdamOptimizer().minimize(cost) pred_y=tf.argmax(tf.nn.softmax(model),1) ephocs = 10 with tf.Session() as sess : tf.initialize_all_variables().run() for epoch in range(ephocs): epoch_cost = 0 i = 0 while i< len(titanic_train) : start = i end = i+batch_size batch_x = np.array( train_x[start:end] ) batch_y = np.array( train_y[start:end] ) _, c = sess.run( [optimizer, cost], feed_dict={x: batch_x, y: batch_y} ) epoch_cost += c i+=batch_size print("Epoch",epoch+1,"completed with a cost of", epoch_cost) # make predictions on test data predictions = pred_y.eval(feed_dict={x : test_X}) return predictions 跳过F#数组中的第一个元素。要爱这种语言有多优雅。