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]]