将三维numpy数组转换为不带np.contenate或np.append的二维数组


x = np.array[[[8, 7, 1, 0, 3],
[2, 8, 5, 5, 2],
[1, 1, 1, 1, 1]],
[[8, 4, 1, 0, 0],
[6, 8, 5, 5, 2],
[1, 1, 1, 1, 1]],
[[2, 4, 0, 2, 3],
[2, 5, 5, 3, 2],
[1, 1, 1, 1, 1]],
[[4, 7, 2, 8, 0],
[1, 3, 6, 5, 2],
[1, 1, 1, 1, 1]]]

我有一个像这样的NumPy数组,我想把它从3D转换成2D,如下所示。

x = np.array[[[8, 7, 1, 0, 3, 8, 4, 1, 0, 0, 2, 4, 0, 2, 3, 4, 7, 2, 8, 0],
[2, 8, 5, 5, 2, 6, 8, 5, 5, 2, 2, 5, 5, 3, 2, 1, 3, 6, 5, 2],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]

事实上,我的数组真的很大,我在处理这个问题上有问题,但使用相同的逻辑。

我不能使用np.contenate或np.append,因为它们工作太慢了。

还有别的办法吗?

实际上,我正在使用这个数组与matplotlib进行打印。

plt.imshow(x)
plt.show()

如果有一种方法可以用matplotlib绘制这个3D阵列,而不将其转换为2D,那就太好了。

您可以尝试使用ndarray.swapaxes+ndarray.reshape

x.swapaxes(0, 1).reshape(x.shape[1], -1)
array([[8, 7, 1, 0, 3, 8, 4, 1, 0, 0, 2, 4, 0, 2, 3, 4, 7, 2, 8, 0],
[2, 8, 5, 5, 2, 6, 8, 5, 5, 2, 2, 5, 5, 3, 2, 1, 3, 6, 5, 2],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]])

计时结果:

In [102]: %timeit x.swapaxes(0, 1).reshape(x.shape[1], -1)                      
818 ns ± 21.9 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
In [103]: %timeit np.hstack(x)                                                  
6.6 µs ± 42.2 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

这里的swapaxes+reshape几乎快8倍。

repl.it中的在线演示

您可以使用np.hstack():

print(np.hstack(x))

打印:

[[8 7 1 0 3 8 4 1 0 0 2 4 0 2 3 4 7 2 8 0]
[2 8 5 5 2 6 8 5 5 2 2 5 5 3 2 1 3 6 5 2]
[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1]]

最新更新