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

Python 如何将一维ndarray列表转换为二维ndarray(mxnet ndarray),python,numpy,mxnet,numpy-ndarray,Python,Numpy,Mxnet,Numpy Ndarray,在这个例子中,我有一个1-d ndarray的列表,长度为9,列表有9个元素,每个元素都有shape=(2048,),所以总共9*(2048,),我从mxnet获得这些ndarray,这样每个ndarray都是数组dtype=numpy.float32 如果我使用np.asarray转换此列表,它将变成以下结果 shape=:(92048,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,1,1,1) 很明显,我想要一个二维数

在这个例子中,我有一个1-d ndarray的列表,长度为9,列表有9个元素,每个元素都有
shape=(2048,)
,所以总共
9*(2048,)
,我从
mxnet
获得这些
ndarray
,这样每个
ndarray
都是
数组
dtype=numpy.float32

如果我使用
np.asarray
转换此列表,它将变成以下结果

shape=:(92048,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,1,1,1)

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

ps:我通过保存一个
npy
文件并加载它来发现这个问题。在将列表转换为
ndarray
之前,我直接保存了列表(因此
np.save
会自动将列表转换为
ndarray
),加载后,我发现形状已经变为上面的形状,这确实不正常


下面的答案,
np.vstack
np.array
都适用于常见的
list
to
ndarray
问题,但无法解决我的问题,因此我怀疑这是
mxnet
的特例,您可以使用
np.vstack
。下面是一个例子:

import numpy as np

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

这将根据需要输出
(92048)

由于给出正确答案作为注释的人解决了我的问题,但没有发布答案,因此我将在此处为其他可能遇到此问题的人发布他的答案

实际上,
np.array
mxnet.ndarray
并不完全相同,因此在
mxnet.ndarray
上直接调用
numpy
方法是危险的。要在
mxnet.ndarray
中使用
numpy
方法,我们应该首先将数组转换为
np.array
,即

mx_ndarray = mxnet.ndarray.zeros(5)
np_array = mx_ndarray.asnumpy() 
然后可以在
np\u数组上使用
numpy
方法


由于上面的答案更一般(
np.vstack()
),我接受它,并将此答案作为参考发布。此外,
np.array()
在上述示例中对
np.vstack()

所有这些1都是可疑的。元组的len是32,这是最大的维度数。这几乎就像是某种递归定义或嵌套。执行
[i.shape for in-arr]
检查所有9个元素的形状可能会很有帮助。挤压应该能够去除那些1,但知道它为什么会产生这种形状还是很好的。还有原始的
dtype
-对象是什么,但是元素和结果呢?@hpaulj我从调试器检查过,所有9个元素都是shape
(2048,)
np.array(列表[0]
产生了什么?或者
np.array(列表[0][0])
。您还没有告诉我们数组数据类型是什么。它必须是
object
。因此您有一个包含9个对象数组的列表(或对象数组),等等。对象数组(或列表)的元素是指针。
np.save
使用
pickle
来编写对象。可能是
mxnet
对象的
pickle
代码有点扭曲,并产生了这种递归形状。在查看
mxnet
之后,我认为在保存mxnet列表时应该使用
mxnet.ndarray
函数或方法ndarrays.hpaulj我添加了
dtype=numpy.float32
,我测试了
np.array(_列表[0])
,它改变了原始数组!(从
(2048,)
(2048,1,1,1,…)
)那么这是一个
mxnet
错误吗?谢谢,这是一个解决方案,但我的问题仍然存在。我尝试了这个代码,它确实生成了一个
(92048)
array,但是当我在代码中使用
np.vstack
时,我原来的问题仍然存在。因为只有一行代码,所以我认为问题在于原始列表。我的列表是
float32
类型,并且在我的
ndarray
中有一个
T
元素,这重要吗?什么是'T!元素?只需添加,
np.ar即可ray
在本例中给出与np.vstack
相同的结果example@hpaulj
T
元素在调试器中似乎是递归的,但是,在上面给出正确结果的示例中,还有一个
T
\u internals\u
元素,它们也是递归的,我使用PyCharm,这些元素显示在d中ebugger@hpaulj在我的代码(在问题中)中,它显示为
result:T={ndarray}{T={ndarray}{..recursive}}
,在这个示例(这个答案中的代码)中,它显示为
result:{u internal{T={ndarray}{T={ndarray}{..recursive}