将不等长度列表的列表重新整形为numpy数组

时间:2014-11-12 14:59:24

标签: python arrays reshape

我有一个带dtype = object的特定数组,数组元素表示不同时间的坐标对,我想将其重新整形为更简单的格式。 我设法为#34;一次"做了这个,但我不能让它适用于所有时间的观察。

每次观察的长度都不同,所以也许我必须使用蒙面值来做到这一点。 下面是一个例子,我希望更好地解释我想要的东西。

# My "input" is:
a = np.array([[], [(2, 0), (2, 2)], [(2, 2), (2, 0), (2, 1), (2, 2)]], dtype=object)

#And my "output" is:

#holding_array_VBPnegl
array([[2, 0],
       [2, 2],
       [2, 1]])

#It doesnt consider my for loop in a.shape[0], so the expected result is :
test = np.array([[[True, True],
       [True, True],
       [True, True]],

       [[2, 0],
       [2, 2],
       [True, True]]

       [[2, 0],
       [2, 2],
       [2, 1]]])

#with "True" the masked values

我尝试使用在StackOverflow上找到的代码:

import numpy as np

holding_list_VBPnegl=[]
for i in range(a.shape[0]):
    for x in a[i]:
        if x in holding_list_VBPnegl:
            pass
        else:
            holding_list_VBPnegl.append(x)

print holding_list_VBPnegl
holding_array_VBPnegl = np.asarray(holding_list_VBPnegl)

1 个答案:

答案 0 :(得分:1)

Numpy数组理想地用于连续内存块,因此您首先需要预先分配所需的内存量。你可以从数组a的长度中得到这个(我很乐意将其列入一个列表 - 不要滥用numpy数组来存储不等长的列表)(你将观察结果称为时间序列,是吗?)和最长观察的长度(在这种情况下为4,a的最后一个元素)。

import numpy as np
a = np.array([[], [(2, 0), (2, 2)], [(2, 2), (2, 0), (2, 1), (2, 2)]], dtype=object)

s = a.tolist()  # Lists are a better container type for your data...
cols = len(s)
rows = max( len(l) for l in s)

m = np.ones((cols, rows, 2))*np.nan

现在,您已预先分配了所需内容,并将阵列设置为屏蔽状态。您现在只需要使用已有的数据填充数组:

for rowind, row in enumerate(s):
    try:
        m[rowind, :len(row),:] = np.array(row)
    except ValueError:
        pass  # broadcasting error: row is empty

result = np.ma.masked_array(m.astype(np.int), mask=np.isnan(m))
result
masked_array(data =
 [[[-- --]
  [-- --]
  [-- --]
  [-- --]]

 [[2 0]
  [2 2]
  [-- --]
  [-- --]]

 [[2 2]
  [2 0]
  [2 1]
  [2 2]]],
             mask =
 [[[ True  True]
  [ True  True]
  [ True  True]
  [ True  True]]

 [[False False]
  [False False]
  [ True  True]
  [ True  True]]

 [[False False]
  [False False]
  [False False]
  [False False]]],
       fill_value = 999999)