【问题标题】:Trying to add a column to a data file尝试将列添加到数据文件
【发布时间】:2016-09-27 07:54:48
【问题描述】:

我有一个包含 2 列的数据文件,x 范围从 -5 到 4 和 f(x)。我需要用 |f(x)| 添加第三列f(x) 的绝对值。然后我需要将 3 列导出为新的数据文件。

目前我的代码如下所示:

from numpy import *
data = genfromtxt("task1.dat")
c = []
ab = abs(data[:,1])
ablist = ab.tolist()
datalist = data.tolist()
c.append(ablist)
c.append (datalist)
A = asarray (c)
savetxt("task1b.dat", A) 

它为“A = asarray(c)”行提供了以下错误消息:

ValueError : setting an array element with a sequence.

有人知道添加此列和导出数据文件的快速有效的方法吗?

【问题讨论】:

    标签: python numpy append


    【解决方案1】:

    您将在c 的列表中获得一个列表。

    无论如何,我认为这更清楚:

    import numpy as np
    data = np.genfromtxt("task1.dat")
    data_new = np.hstack((data, np.abs(data[:,-1]).reshape((-1,1))))
    np.savetxt("task_out.dat", data_new)
    

    【讨论】:

      【解决方案2】:

      c 是一个列表,当你执行时

      c.append(ablist)
      c.append (datalist)
      

      它将 2 个不同形状的列表附加到列表 c。它可能最终看起来像这样

      c == [ [ [....],[....]], [....]]
      

      由于形状差异,numpy.asarray 无法解析 (我说可能是因为我假设genfromtxt("task1.dat") 中有一个二维矩阵)

      你可以做些什么来连接列

      from numpy import *
      data = genfromtxt("task1.dat")
      ab = abs(data[:,1])
      c = concatenate((data,ab.reshape(-1,1),axis=1)
      savetxt("task1b.dat", c) 
      

      【讨论】:

        【解决方案3】:

        data 是一个二维数组,如:

        In [54]: data=np.arange(-5,5).reshape(5,2)
        
        In [55]: data
        Out[55]: 
        array([[-5, -4],
               [-3, -2],
               [-1,  0],
               [ 1,  2],
               [ 3,  4]])
        
        In [56]: ab=abs(data[:,1])
        

        concatenate 2 个数组有多种方法。在这种情况下,data 是 2d,ab 是 1d,因此您必须采取一些步骤来确保它们都是 2d。 np.column_stack 为我们做这件事。

        In [58]: np.column_stack((data,ab))
        Out[58]: 
        array([[-5, -4,  4],
               [-3, -2,  2],
               [-1,  0,  0],
               [ 1,  2,  2],
               [ 3,  4,  4]])
        

        通过对索引稍作更改,我们可以将 ab 从一开始设为列数组,并在第二轴上简单地创建 concatenate

        ab=abs(data[:,[1]])   
        np.concatenate((data,ab),axis=1)
        

        ===================

        与您的tolist 相同的数字会产生c 类似

        In [72]: [ab.tolist()]+[data.tolist()]
        Out[72]: [[4, 2, 0, 2, 4], [[-5, -4], [-3, -2], [-1, 0], [1, 2], [3, 4]]]
        

        这对array 来说不是很好的输入。

        要走列表路线,您需要对 zip 进行迭代:

        In [86]: list(zip(data,ab))
        Out[86]: 
        [(array([-5, -4]), 4),
         (array([-3, -2]), 2),
         (array([-1,  0]), 0),
         (array([1, 2]), 2),
         (array([3, 4]), 4)]
        
        In [87]: c=[]
        
        In [88]: for i,j in zip(data,ab):
            c.append(i.tolist()+[j])
           ....:     
        
        In [89]: c
        Out[89]: [[-5, -4, 4], [-3, -2, 2], [-1, 0, 0], [1, 2, 2], [3, 4, 4]]
        
        In [90]: np.array(c)
        Out[90]: 
        array([[-5, -4,  4],
               [-3, -2,  2],
               [-1,  0,  0],
               [ 1,  2,  2],
               [ 3,  4,  4]])
        

        显然这会比数组连接要慢,但研究这可能有助于您理解数组和列表。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-02
          • 1970-01-01
          • 1970-01-01
          • 2016-12-17
          • 2021-08-20
          • 2013-10-18
          相关资源
          最近更新 更多