【问题标题】:Numpy reading data from '.npy' file directly into arraysNumpy 将“.npy”文件中的数据直接读取到数组中
【发布时间】:2016-07-20 18:29:43
【问题描述】:

这可能是一个愚蠢的问题,但我似乎无法找到答案。我有一个以前使用np.save 保存的大型数组,现在我想将数据加载到一个新文件中,从每一列创建一个单独的列表。唯一的问题是我的大数组中的某些行只有一个 nan 值,所以数组看起来像这样(作为一个极其简化的示例):

np.array([[5,12,3], 
          [nan], 
          [10,13,9],
          [nan],
          [nan]])

我可以使用 for 循环来实现我想要的,但我想知道是否有比这更好的方法:

import numpy as np

results = np.load('data.npy')
depth, upper, lower = [], [], []

for item in results:
    if len(item) > 1:
        depth.append(item[0])
        upper.append(item[1])
        lower.append(item[2])
    else:
        depth.append(np.nan)
        upper.append(np.nan)
        lower.append(np.nan)

我想要的输出如下所示:

depth = [5,nan,10,nan,nan]
upper = [12,nan,13,nan,nan]
lower = [3,nan,9,nan,nan]

感谢您的帮助!我意识到我之前应该修改过创建“data.npy”文件的代码,这样每行的列数都相同,但是该代码已经需要几个小时才能运行,我宁愿避免这样做!

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    对于不同长度的子数组,这是 dtype=object 数组。对于大多数目的,这与这些子数组的列表相同。所以大多数动作都需要迭代。

    您的操作的变体将是列表理解

    In [61]: dd=[[nan,nan,nan] if len(i)==1 else i for i in d]
    
    In [62]: dd
    Out[62]: [[5, 12, 3], [nan, nan, nan], [10, 13, 9], [nan, nan, nan], [nan, nan, nan]]
    

    您的三个目标数组是以下列:

    In [63]: np.array(dd)
    Out[63]: 
    array([[  5.,  12.,   3.],
           [ nan,  nan,  nan],
           [ 10.,  13.,   9.],
           [ nan,  nan,  nan],
           [ nan,  nan,  nan]])
    

    另一种方法是用nan 填充该类型的数组,然后复制非nan 值。但这也需要迭代来找到子数组的长度。

    In [65]: [len(i)>1 for i in d]
    Out[65]: [True, False, True, False, False]
    

    np.nan 是一个浮点数,因此带有nan 的二维数组将是 dtype 浮点数。

    【讨论】:

    • 谢谢!我使用了您的第一个建议,然后将dd 转换为depth = dd[0] 等等。比我正在做的所有附加看起来更干净。
    【解决方案2】:

    使用 pandas 的更短的方法:

    import numpy as np
    import pandas as pd
    
    data = np.array([[5,12,3], [np.nan], [10,13,9], [np.nan], [np.nan]])
    df = pd.DataFrame.from_records(data.tolist())
    df.columns = ['depth','upper','lower']
    

    输出:

    >>> df
       depth  upper  lower
    0    5.0   12.0    3.0
    1    NaN    NaN    NaN
    2   10.0   13.0    9.0
    3    NaN    NaN    NaN
    4    NaN    NaN    NaN
    

    您现在可以对每一列进行寻址以获得所需的输出

    >>> df.depth
    0     5.0
    1     NaN
    2    10.0
    3     NaN
    4     NaN
    

    如果您需要列表:

    >>> df.depth.tolist()
    [5.0, nan, 10.0, nan, nan]
    

    【讨论】:

      猜你喜欢
      • 2016-06-16
      • 1970-01-01
      • 2018-03-01
      • 2018-08-31
      • 2019-09-10
      • 2011-06-25
      • 2020-10-11
      • 2018-07-31
      • 2019-09-15
      相关资源
      最近更新 更多