从不等形状的一维阵列构造二维numpy阵列NumPy的

时间:2018-05-08 17:58:08

标签: python numpy

在python中有三个不同形状的一维数组(如下面给出的那些)

a0 = np.array([5,6,7,8,9])
a1 = np.array([1,2,3,4])
a2 = np.array([11,12])

我假设数组a0对应索引i=0a1对应索引i=1a2对应i=2 。根据这些假设,我想构建一个新的二维数组,其中行将对应于数组的索引(i=0,1,2),列将是数组a0, a1, a2的条目。

在我在这里给出的例子中,我希望二维数组看起来像

result = np.array([ [0,5], [0,6], [0,7], [0,8], [0,9], [1,1], [1,2],\
           [1,3], [1,4], [2,11], [2,12]  ]) 

我将非常感谢能够解答如何实现这一目标。在我正在处理的实际问题中,我处理的是三个以上的一维数组。所以,如果答案考虑到这一点,那将是非常好的。

3 个答案:

答案 0 :(得分:3)

这样做的一种方法是简单的列表理解:

.page-break {page-break-before:always}

通过关注将此扩展到更多数组,您只需创建数组名称列表并使用该列表作为result = np.array([[i, arr_v] for i, arr in enumerate([a0, a1, a2]) for arr_v in arr]) >>> result array([[ 0, 5], [ 0, 6], [ 0, 7], [ 0, 8], [ 0, 9], [ 1, 1], [ 1, 2], [ 1, 3], [ 1, 4], [ 2, 11], [ 2, 12]]) 的参数,即可轻松添加任意数量的数组:

enumerate

答案 1 :(得分:2)

您可以使用numpy堆叠功能来加速:

aa = [a0, a1, a2]
np.hstack(tuple(np.vstack((np.full(ai.shape, i), ai)) for i, ai in enumerate(aa))).T

答案 2 :(得分:2)

这是一种几乎矢量化的方法 -

L = [a0,a1,a2] # list of all arrays
lens = [len(i) for i in L] # only looping part*
out = np.dstack(( np.repeat(np.arange(len(L)), lens), np.concatenate(L)))

*循环部分只是为了得到数组的长度,这对总运行时间的影响可以忽略不计。

示例运行 -

In [19]: L = [a0,a1,a2] # list of all arrays

In [20]: lens = [len(i) for i in L]

In [21]: np.dstack(( np.repeat(np.arange(len(L)), lens), np.concatenate(L)))
Out[21]: 
array([[[ 0,  5],
        [ 0,  6],
        [ 0,  7],
        [ 0,  8],
        [ 0,  9],
        [ 1,  1],
        [ 1,  2],
        [ 1,  3],
        [ 1,  4],
        [ 2, 11],
        [ 2, 12]]])

另一种方法可能是避免np.repeat并使用一些数组初始化+ cumsum方法,这对于大量数组会更好,如下所示 -

col1 = np.concatenate(L)
col0 = np.zeros(len(col1), dtype=col1.dtype)
col0[np.cumsum(lens[:-1])] = 1
out = np.dstack((col0.cumsum(), col1))

或使用np.maximum.accumulate替换第二个cumsum -

col0[np.cumsum(lens[:-1])] = np.arange(1,len(L))
out = np.dstack((np.maximum.accumulate(col0), col1))