我有一个带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)
答案 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)