我有一个numpyarray,它看起来像这样:
[
[1,2,6,1,5]
[3,6,46]
[7,7,6,6,6,62,4]
[2,4,52,85,78]
]
数据是异构的
现在我的问题是,如果有可能没有为每一行(意味着没有" for循环")用分界符分割数据。
结果应该看起来像(3d数组)
[
[[1][2][6][1][5]]
[[3][6][46]]
[[7][7][6][6][6][62][4]]
[[2][4][52][85][78]]
]
答案 0 :(得分:1)
<强>设置强>
a = np.asarray([
[1,2,6,1,5],
[3,6,46],
[7,7,6,6,6,62,4],
[2,4,52,85,78],
])
<强>解决方案强>
#put the array to a DataFrame and then reshape it to a 3D array.
import pandas as pd
a2 = pd.DataFrame(a).applymap(lambda x: np.asarray(x).reshape(-1,1)).values
print(a2)
Out[264]:
array([[array([[1],
[2],
[6],
[1],
[5]])],
[array([[ 3],
[ 6],
[46]])],
[ array([[ 7],
[ 7],
[ 6],
[ 6],
[ 6],
[62],
[ 4]])],
[array([[ 2],
[ 4],
[52],
[85],
[78]])]], dtype=object)
<强>更新强>
另一种不使用pandas的方法,只有numpy和内置函数。
a2 = np.r_[list(map(lambda x: np.asarray(x).reshape(-1,1),a))]
print(a2)
Out[312]:
array([array([[1],
[2],
[6],
[1],
[5]]),
array([[ 3],
[ 6],
[46]]),
array([[ 7],
[ 7],
[ 6],
[ 6],
[ 6],
[62],
[ 4]]),
array([[ 2],
[ 4],
[52],
[85],
[78]])], dtype=object)
答案 1 :(得分:1)
方法#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:如果你可以使用数组数组作为输出,这里是另一个使用list-comprehension -
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