我有按行创建的数据,6列,我不知道最后的行数。
目前,我正在创建一个包含所有零的200x6的2D切片,然后逐行用我的数据替换这些零。数据来自另一个dataframe df。
它可以工作,但我不喜欢最后一行都是零。我看到了两种解决方案:-当我完成时,我删除所有最后只有零的行--我创建了一个空的切片,并将我的数据逐步追加到其中
我尝试了各种方法,但都想不出如何编写这2种解决方案中的任何一种。
目前,我的代码如下所示:
var orders [200][6]float64 // create my 2d slice with zeros
order_line := 0
for i := start_line; i <= end_line; i++ {
if sell_signal == "1" {
//record line number and sold price in orders slice
orders[order_line][1] = float64(i+1)
orders[order_line][2],err = strconv.ParseFloat(df[i][11], 64)
order_line = order_line + 1
}
}我查看了Append命令,但是我尝试了各种组合,以使它在2d片上工作,但找不到起作用的。
编辑:从下面的注释中,我了解到我实际上正在创建一个数组,而不是一个片段,并且没有方法将数据附加到数组中。
发布于 2018-10-08 18:13:39
如果外部容器有一个未知的元素数,而内部容器正好有6个元素,那么使用一个数组片段。
var orders [][6]float64
for i := start_line; i <= end_line; i++ {
if sell_signal == "1" {
n, err = strconv.ParseFloat(df[i][11], 64)
if err != nil {
// handle error
}
orders = append(orders, [6]float64{1: float64(i + 1), 2: n})
}
}此代码使用复合文字 6Float 64值,而不是像问题中那样逐元素分配元素。
稍后您可以返回并访问6float64的元素。例如:
orders[i][3] = orders[i][1] + orders[i][2]发布于 2018-10-08 17:01:34
在Golang中,以片代替数组为首选。
不需要在以前创建这么多行,只需每次遍历数据以在父片中添加新行时创建一个切片即可。这将帮助您只拥有所需的行数,并且您需要考虑长度,因为您在父片的索引处附加了一个片。
package main
import (
"fmt"
"math/rand"
)
func main() {
orders := make([][]float64, 0) // create my 2d slice with zeros
for i := 0; i <= 6; i++ {
value := rand.Float64()
temp := make([]float64, 0)
temp = append(temp, value)
orders = append(orders, [][]float64{temp}...)
}
fmt.Println(orders)
}请检查游乐场上的工作代码
如果您注意到,我正在创建一个新的temp片in循环,其中包含float64值,然后将值附加到我传递给父片的临时切片中。
因此,每当我将临时切片附加到父片时,将创建一个新的行。
注:
数组有它们的位置,但是它们有点不灵活,所以在Go代码中不会经常看到它们。不过,切片到处都是。它们以阵列为基础,提供强大的力量和方便。
编辑:
处理前3列,然后操作下3列的值,这些列将被添加到temp片并附加到主片中。使用下面的代码逻辑:
package main
import (
"fmt"
"math/rand"
"strconv"
)
func main() {
orders := make([][]float64, 0) // create my 2d slice with zeros
for i := 0; i <= 6; i++ {
value := rand.Float64()
// logic to create first 3 columns
temp := make([]float64, 0)
temp = append(temp, value)
temp2 := make([]float64, 3)
// logic to create next 3 columns on basis of previous 3 columns
for j, value := range temp {
addcounter, _ := strconv.ParseFloat("1", 64)
temp2[j] = value + addcounter
}
temp = append(temp, temp2...)
orders = append(orders, [][]float64{temp}...)
}
fmt.Println(orders)
}工作示例
发布于 2018-10-08 16:53:40
为了获得更好的可读性和更容易的切片处理,只需创建一个struct类型并用它们填充一个片。这使您可以正确地命名每个字段,而不是神奇的索引号,这样可以更容易地填写行并在以后使用。除非对列使用数组/片有特定的原因,否则这是比较惯用的Go。下面的示例将填充一个部分,无论您有多少结果,也不会有更多结果。
这里的完整示例:https://play.golang.org/p/mLtabqO8MNj
type Row struct {
Thing float64
Data float64
More float64
Stuff float64
Another float64
Number float64
}
var rows []*Row
numResults := 15
for i := 0; i <= numResults; i++ {
row := &Row{}
row.Thing = 2.5
// ... fill values
rows = append(rows, row)
}https://stackoverflow.com/questions/52706495
复制相似问题