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