Numpy立即用分隔符拆分数据

时间:2017-05-19 11:58:19

标签: arrays python-2.7 numpy

我有一个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]]
]

2 个答案:

答案 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