在python中有三个不同形状的一维数组(如下面给出的那些)
a0 = np.array([5,6,7,8,9])
a1 = np.array([1,2,3,4])
a2 = np.array([11,12])
我假设数组a0
对应索引i=0
,a1
对应索引i=1
而a2
对应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] ])
我将非常感谢能够解答如何实现这一目标。在我正在处理的实际问题中,我处理的是三个以上的一维数组。所以,如果答案考虑到这一点,那将是非常好的。
答案 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))