Python 如何将一维ndarray列表转换为二维ndarray(mxnet ndarray)
在这个例子中,我有一个1-d ndarray的列表,长度为9,列表有9个元素,每个元素都有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) 很明显,我想要一个二维数
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
tondarray
问题,但无法解决我的问题,因此我怀疑这是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@hpauljT
元素在调试器中似乎是递归的,但是,在上面给出正确结果的示例中,还有一个T
和\u internals\u
元素,它们也是递归的,我使用PyCharm,这些元素显示在d中ebugger@hpaulj在我的代码(在问题中)中,它显示为result:T={ndarray}{T={ndarray}{..recursive}}
,在这个示例(这个答案中的代码)中,它显示为result:{u internal{T={ndarray}{T={ndarray}{..recursive}