首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何附加到2d片

如何附加到2d片
EN

Stack Overflow用户
提问于 2018-10-08 16:26:49
回答 3查看 9.3K关注 0票数 2

我有按行创建的数据,6列,我不知道最后的行数。

目前,我正在创建一个包含所有零的200x6的2D切片,然后逐行用我的数据替换这些零。数据来自另一个dataframe df。

它可以工作,但我不喜欢最后一行都是零。我看到了两种解决方案:-当我完成时,我删除所有最后只有零的行--我创建了一个空的切片,并将我的数据逐步追加到其中

我尝试了各种方法,但都想不出如何编写这2种解决方案中的任何一种。

目前,我的代码如下所示:

代码语言:javascript
复制
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片上工作,但找不到起作用的。

编辑:从下面的注释中,我了解到我实际上正在创建一个数组,而不是一个片段,并且没有方法将数据附加到数组中。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-10-08 18:13:39

如果外部容器有一个未知的元素数,而内部容器正好有6个元素,那么使用一个数组片段。

代码语言:javascript
复制
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的元素。例如:

代码语言:javascript
复制
 orders[i][3] = orders[i][1] + orders[i][2]
票数 2
EN

Stack Overflow用户

发布于 2018-10-08 17:01:34

在Golang中,以片代替数组为首选。

不需要在以前创建这么多行,只需每次遍历数据以在父片中添加新行时创建一个切片即可。这将帮助您只拥有所需的行数,并且您需要考虑长度,因为您在父片的索引处附加了一个片。

代码语言:javascript
复制
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片并附加到主片中。使用下面的代码逻辑:

代码语言:javascript
复制
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)
}

工作示例

票数 6
EN

Stack Overflow用户

发布于 2018-10-08 16:53:40

为了获得更好的可读性和更容易的切片处理,只需创建一个struct类型并用它们填充一个片。这使您可以正确地命名每个字段,而不是神奇的索引号,这样可以更容易地填写行并在以后使用。除非对列使用数组/片有特定的原因,否则这是比较惯用的Go。下面的示例将填充一个部分,无论您有多少结果,也不会有更多结果。

这里的完整示例:https://play.golang.org/p/mLtabqO8MNj

代码语言:javascript
复制
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)
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52706495

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档