Numpy将“.npy”文件中的数据直接读入数组

时间:2016-07-19 19:36:40

标签: python arrays numpy

这可能是一个愚蠢的问题,但我似乎找不到答案。我有一个大型数组,我之前使用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”文件的代码,因此每行的列数相同,但该代码已经需要几个小时才能运行,我宁愿避免这样做!

2 个答案:

答案 0 :(得分: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 float。

答案 1 :(得分:1)

使用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]