【问题标题】:Unable to unpack elements in list无法解压列表中的元素
【发布时间】:2013-09-01 03:44:24
【问题描述】:

这是我的代码的MWE

import numpy as np

# Load data from file.
data = np.genfromtxt('data_input', dtype=None, unpack=True)

print data

这是data_input 文件的示例:

01_500_aa_1000    990.0    990.0   112.5      0.2       72  0  0  1  0  0  0  0  0  0   0   0   0   1
02_500_aa_0950    990.0    990.0   112.5      0.2       77  0  0  1  0  0  0  0  0  0   0   0   0   1
03_500_aa_0600    990.0    990.0   112.5     0.18       84  0  0  1  0  0  0  0  0  0   0   0   0   1
04_500_aa_0700    990.0    990.0   112.5     0.18       84  0  0  1  0  0  0  0  0  0   0   0   0   1

unpack 参数似乎不起作用,因为它总是打印:

[ ('01_500_aa_1000', 990.0, 990.0, 112.5, 0.2, 72, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1)
 ('02_500_aa_0950', 990.0, 990.0, 112.5, 0.2, 77, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1)
 ('03_500_aa_0600', 990.0, 990.0, 112.5, 0.18, 84, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1)
 ('04_500_aa_0700', 990.0, 990.0, 112.5, 0.18, 84, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1)]

任何人都可以复制这个吗?我做错了什么?

【问题讨论】:

    标签: python numpy unpack


    【解决方案1】:

    您收到此消息是因为 genfromtxt 返回的是 numpy record array,而不是 list。只是当你print() 到控制台时它看起来像list

    from cStringIO import StringIO
    raw = """01_500_aa_1000    990.0    990.0   112.5      0.2       72  0  0  1  0  0  0  0  0  0   0   0   0   1
    02_500_aa_0950    990.0    990.0   112.5      0.2       77  0  0  1  0  0  0  0  0  0   0   0   0   1
    03_500_aa_0600    990.0    990.0   112.5     0.18       84  0  0  1  0  0  0  0  0  0   0   0   0   1
    04_500_aa_0700    990.0    990.0   112.5     0.18       84  0  0  1  0  0  0  0  0  0   0   0   0   1"""
    sio = StringIO(raw)
    data = genfromtxt(sio, dtype=None, unpack=False)
    print data
    print
    print data.dtype
    

    给予:

    [ ('01_500_aa_1000', 990.0, 990.0, 112.5, 0.2, 72, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1)
     ('02_500_aa_0950', 990.0, 990.0, 112.5, 0.2, 77, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1)
     ('03_500_aa_0600', 990.0, 990.0, 112.5, 0.18, 84, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1)
     ('04_500_aa_0700', 990.0, 990.0, 112.5, 0.18, 84, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1)]
    
    [('f0', 'S14'), ('f1', '<f8'), ('f2', '<f8'), ('f3', '<f8'), ('f4', '<f8'), ('f5', '<i8'), ('f6', '<i8'), ('f7', '<i8'), ('f8', '<i8'), ('f9', '<i8'), ('f10', '<i8'), ('f11', '<i8'), ('f12', '<i8'), ('f13', '<i8'), ('f14', '<i8'), ('f15', '<i8'), ('f16', '<i8'), ('f17', '<i8'), ('f18', '<i8')]
    

    unpack=Trueunpack=False 似乎返回相同的内容,因为您需要 recarray。我建议您尝试 pandas 并完全忘记 recarrays。您可以将recarray 传递给pandas.DataFrame,然后搞定!例如,

    df = DataFrame(data)
    print df
    print
    print df.f0
    

    产量:

                   f0         f1         f2         f3         f4  f5  f6  f7  f8  \
    0  01_500_aa_1000     990.00     990.00     112.50       0.20  72   0   0   1   
    1  02_500_aa_0950     990.00     990.00     112.50       0.20  77   0   0   1   
    2  03_500_aa_0600     990.00     990.00     112.50       0.18  84   0   0   1   
    3  04_500_aa_0700     990.00     990.00     112.50       0.18  84   0   0   1   
    
       f9  f10  f11  f12  f13  f14  f15  f16  f17  f18  
    0   0    0    0    0    0    0    0    0    0    1  
    1   0    0    0    0    0    0    0    0    0    1  
    2   0    0    0    0    0    0    0    0    0    1  
    3   0    0    0    0    0    0    0    0    0    1  
    
    0    01_500_aa_1000
    1    02_500_aa_0950
    2    03_500_aa_0600
    3    04_500_aa_0700
    Name: f0, dtype: object
    

    【讨论】:

      【解决方案2】:

      正如@Phillip Cloud 所提到的,由于数据类型(字符串和数字)混合在一起,您得到了一个重新数组 - 第 0 列中的字符串导致了这种情况。

      您可以通过单独导入第 0 列来解决此问题:

      >>> np.genfromtxt('data_input', usecols=range(1,18))
      array([[  9.90000000e+02,   9.90000000e+02,   1.12500000e+02,
                2.00000000e-01,   7.20000000e+01,   0.00000000e+00,
                0.00000000e+00,   1.00000000e+00,   0.00000000e+00,
                0.00000000e+00,   0.00000000e+00,   0.00000000e+00,
                0.00000000e+00,   0.00000000e+00,   0.00000000e+00,
                0.00000000e+00,   0.00000000e+00],
             [  9.90000000e+02,   9.90000000e+02,   1.12500000e+02,
                2.00000000e-01,   7.70000000e+01,   0.00000000e+00,
                0.00000000e+00,   1.00000000e+00,   0.00000000e+00,
                0.00000000e+00,   0.00000000e+00,   0.00000000e+00,
                0.00000000e+00,   0.00000000e+00,   0.00000000e+00,
                0.00000000e+00,   0.00000000e+00],
             [  9.90000000e+02,   9.90000000e+02,   1.12500000e+02,
                1.80000000e-01,   8.40000000e+01,   0.00000000e+00,
                0.00000000e+00,   1.00000000e+00,   0.00000000e+00,
                0.00000000e+00,   0.00000000e+00,   0.00000000e+00,
                0.00000000e+00,   0.00000000e+00,   0.00000000e+00,
                0.00000000e+00,   0.00000000e+00],
             [  9.90000000e+02,   9.90000000e+02,   1.12500000e+02,
                1.80000000e-01,   8.40000000e+01,   0.00000000e+00,
                0.00000000e+00,   1.00000000e+00,   0.00000000e+00,
                0.00000000e+00,   0.00000000e+00,   0.00000000e+00,
                0.00000000e+00,   0.00000000e+00,   0.00000000e+00,
                0.00000000e+00,   0.00000000e+00]])
      >>> np.genfromtxt('data_input', usecols=0,dtype=None)
      array(['01_500_aa_1000', '02_500_aa_0950', '03_500_aa_0600',
         '04_500_aa_0700'], 
        dtype='|S14')
      

      或者,您可以像这样引用recarray 中的列:

      >>> data['f0']
      array(['01_500_aa_1000', '02_500_aa_0950', '03_500_aa_0600',
             '04_500_aa_0700'], 
            dtype='|S14')
      >>> data['f5']
      array([72, 77, 84, 84])
      

      【讨论】:

        【解决方案3】:

        我可以重现这个。但是,如果您将 dtype 更改为 float 我会得到

        [[             nan              nan              nan              nan]
         [  9.90000000e+02   9.90000000e+02   9.90000000e+02   9.90000000e+02]
         [  9.90000000e+02   9.90000000e+02   9.90000000e+02   9.90000000e+02]
         [  1.12500000e+02   1.12500000e+02   1.12500000e+02   1.12500000e+02]
         [  2.00000000e-01   2.00000000e-01   1.80000000e-01   1.80000000e-01]
         [  7.20000000e+01   7.70000000e+01   8.40000000e+01   8.40000000e+01]
         [  0.00000000e+00   0.00000000e+00   0.00000000e+00   0.00000000e+00]
         ...
        

        我的想法来自this mailing list question

        查看here 给出的答案。 np.genfromtxt() returns data of the type ndarray.这个 不能异类。

        【讨论】:

        • 这不行,我需要第一列中列出的名称。
        • 看看我编辑的答案。也许你可以拆分信息。一个包含数据的数组和一个包含名称的数组?
        • this怎么样
        【解决方案4】:

        我发布了我自己的答案,因为这是我最终使用的。

        import numpy as np
        
        # Load data from file.
        data = np.genfromtxt('data_input', dtype=None)
        
        # Force transpose list.
        data = zip(*data)
        

        这确实有效,而且很容易理解和使用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-01-31
          • 2013-02-27
          • 1970-01-01
          • 1970-01-01
          • 2014-08-26
          • 1970-01-01
          相关资源
          最近更新 更多