将1D数组合并成一个2D数组

4

是否有内置函数将两个一维数组合并为一个二维数组? 考虑以下示例:

X=np.array([1,2])
y=np.array([3,4])
result=np.array([[1,3],[2,4]])

我可以想到两种简单的解决方案。第一种方法很直接。

np.transpose([X,y])

另一种方法使用lambda函数。
np.array(list(map(lambda i: [a[i],b[i]], range(len(X)))))

尽管第二个看起来更复杂,但它似乎比第一个快了近两倍。

编辑 第三种解决方案涉及zip()函数。

np.array(list(zip(X, y)))

它比lambda函数更快,但比@Divakar建议的column_stack解决方案慢。

np.column_stack((X,y))

3
使用column_stack函数:np.column_stack((X,y)) - Divakar
这个 column_stack 很不错,谢谢 :-)。 - Grzegorz Rut
@ManishSaraswat 它给出了不同的结果! - Grzegorz Rut
1
“transpose” 操作实际上是 np.array([X,y]).T。它必须首先创建一个数组,然后对其应用转置方法。(我应该检查 “strides” 来验证) - hpaulj
1
使用 transpose(函数、方法或属性)的方法会生成一个 F 顺序的数组,其步幅为 (8,16),而不是通常的 (16,8)。所有的 stack 函数都使用 np.concatenate - hpaulj
2个回答

3
这是一种方法:
import numpy as np
X = np.array([1,2])
y = np.array([3,4])
result = np.vstack((X, y)).T
print(result)

# [[1 3]
#  [2 4]]     

看起来不错,但比使用 lambda 函数的解决方案慢。 - Grzegorz Rut

3

考虑可扩展性。如果我们增加数组的大小,完整的numpy解决方案比涉及Python内置操作的解决方案要快得多:

np.random.seed(1234)
X = np.random.rand(10000)
y = np.random.rand(10000)

%timeit np.array(list(map(lambda i: [X[i],y[i]], range(len(X)))))
6.64 ms ± 32.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit np.array(list(zip(X, y)))
4.53 ms ± 33.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit np.column_stack((X,y))
19.2 µs ± 30.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit np.transpose([X,y])
16.2 µs ± 247 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit np.vstack((X, y)).T
14.2 µs ± 94.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

考虑所有提出的解决方案,np.vstack(X,y).T 在处理更大的数组大小时是最快的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接