如何将一维 ndarray 列表转换为二维 ndarray (mxnet ndarray)

How to transform a list of 1-D ndarray to 2-D ndarray (mxnet ndarray)

在这个例子中,我有一个一维 ndarray 的列表,长度为 9,列表有 9 个元素,每个元素有 shape=(2048,),所以总共 9 * (2048,),我得到这些ndarray 来自 mxnet 这样每个 ndarray 就是 <NDArray 2048 @cpu(0)> 数组 dtype=numpy.float32

如果我用np.asarray改造这个列表,就会变成下面的结果

shape=<class 'tuple'>: (9, 2048, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)

很明显,我想要一个二维数组,有shape=(9, 2048),如何解决这个问题?

ps:我通过保存 npy 文件并加载它发现了这个问题。我在转成ndarray之前直接保存了列表(所以np.save会自动把列表转成ndarrary)加载后发现形状变成了上面的东西, 这真是变态

下面的答案,np.vstacknp.array都适用于常见的listndarray问题,但无法解决我的问题,所以我怀疑这是 mxnet

的一些特例

您可以使用 np.vstack。这是一个例子:

import numpy as np

li = [np.zeros(2048) for _ in range(9)]
result = np.vstack(li)
print(result.shape)

这会根据需要输出 (9, 2048)

由于给出正确答案作为评论的人解决了我的问题但没有 post 答案,我会 post 他的答案在这里供其他可能也遇到此问题的人使用

其实np.arraymxnet.ndarray并不完全一样,直接调用mxnet.ndarray上的numpy方法是很危险的。要在mxnet.ndarray中使用numpy方法,首先要将数组转换为np.array,即

mx_ndarray = mxnet.ndarray.zeros(5)
np_array = mx_ndarray.asnumpy() 

然后 numpy 方法可以用于 np_array

由于上面的答案比较笼统(np.vstack()),我接受了,只是post这个答案作为参考,另外,np.array()在上面做了同样的事情np.vstack()

的示例