方法#1:这是一种使用输入数组的扁平列表版本然后简单拆分的方法 -
def extend_dims_objectarr(a):
v = np.concatenate(a)[:,None].tolist()
idx = np.r_[0,np.cumsum(list(map(len,a)))]
return np.array([v[i:j] for i,j in zip(idx[:-1], idx[1:])])
样本输入、输出-
In [81]: a
Out[81]:
array([[1, 2, 6, 1, 5], [3, 6, 46], [7, 7, 6, 6, 6, 62, 4],
[2, 4, 52, 85, 78]], dtype=object)
In [82]: extend_dims_objectarr(a)
Out[82]:
array([[[1], [2], [6], [1], [5]], [[3], [6], [46]],
[[7], [7], [6], [6], [6], [62], [4]],
[[2], [4], [52], [85], [78]]], dtype=object)
方法#2:如果您可以将数组数组作为输出,这里是另一个使用列表理解的方法 -
np.array([np.array(i)[:,None] for i in a])
要获取列表数组作为输出,只需附加 .tolist() : np.array(i)[:,None].tolist()。
运行时测试
In [108]: a = np.array([np.random.randint(0,9,(i)).tolist() \
for i in np.random.randint(2,9,(10000))])
# @Allen's soln
In [109]: %timeit np.r_[list(map(lambda x: np.asarray(x).reshape(-1,1),a))]
100 loops, best of 3: 15.2 ms per loop
# Proposed in this post
In [110]: %timeit np.array([np.array(i)[:,None] for i in a])
100 loops, best of 3: 9.94 ms per loop