Python 是否将二维numpy阵列列表转换为一个三维numpy阵列?
我有一个数百个10x10阵列的列表,我想将它们叠加到一个Nx10x10阵列中。起初我尝试了一个简单的方法Python 是否将二维numpy阵列列表转换为一个三维numpy阵列?,python,numpy,Python,Numpy,我有一个数百个10x10阵列的列表,我想将它们叠加到一个Nx10x10阵列中。起初我尝试了一个简单的方法 newarray=np.array(mylist) 但返回的结果是“ValueError:使用序列设置数组元素” 然后我找到了dstack()的在线文档,它看起来非常完美:“……这是一种将2D数组(图像)堆叠到单个3D数组中进行处理的简单方法。”这正是我要做的。但是, newarray = np.dstack(mylist) 告诉我“ValueError:array维度必须一致,d_0除外
newarray=np.array(mylist)
但返回的结果是“ValueError:使用序列设置数组元素”
然后我找到了dstack()的在线文档,它看起来非常完美:“……这是一种将2D数组(图像)堆叠到单个3D数组中进行处理的简单方法。”这正是我要做的。但是,
newarray = np.dstack(mylist)
告诉我“ValueError:array维度必须一致,d_0除外”,这很奇怪,因为我所有的数组都是10x10。我想问题可能是dstack()需要一个元组而不是列表,但是
newarray = np.dstack(tuple(mylist))
产生了同样的结果
在这一点上,我花了大约两个小时在这里和其他地方搜索,以找出我做错了什么和/或如何正确地进行。我甚至尝试过将数组列表转换为一个列表列表,然后再转换回一个3D数组,但也没有成功(我最终得到了数组列表,然后再次出现了“将数组元素设置为序列”错误)
任何帮助都将不胜感激
newarray = np.dstack(mylist)
应该有用。例如:
import numpy as np
# Here is a list of five 10x10 arrays:
x = [np.random.random((10,10)) for _ in range(5)]
y = np.dstack(x)
print(y.shape)
# (10, 10, 5)
# To get the shape to be Nx10x10, you could use rollaxis:
y = np.rollaxis(y,-1)
print(y.shape)
# (5, 10, 10)
np.dstack
返回一个新数组。因此,使用np.dstack
需要与输入数组一样多的额外内存。如果内存紧张,需要更少内存的np.dstack
的替代方法是
首先为最终数组分配空间,然后将输入数组一次一个地放入其中。
例如,如果您有58个shape数组(1594592380),那么您可以使用
y = np.empty((159459, 2380, 58))
for i in range(58):
# instantiate the input arrays one at a time
x = np.random.random((159459, 2380))
# copy x into y
y[..., i] = x
当您执行类似于
[item.shape for item in mylist if item.shape!=(10,10)]
的操作时,您会得到什么?(也就是说,你真的确定所有的阵列都有相同的形状吗?)。。我一直在使用hstack和vstack与[:,:,newaxis]rubbishfacepalm,结果我的图像只有10x8,所以这纯粹是我自己的疏忽。不过,我还没有完全考虑rollaxis部分,这很有帮助。谢谢你的快速回复np.dstack
如果这是一个不错的选择,但我得到了一个内存错误,该列表包含58个2D数组,每个2D具有[1594592380]形状。有什么建议吗?@serafeim:购买更多的内存或将计算转移到内存更多的机器上是显而易见的解决方案。另一种可能是制作一个(基于文件的NumPy数组)并用58个2D数组(也可以是memmaps)中的数据填充它。基于文件的计算比基于RAM的计算慢,但如果您无法移动到内存更多的机器,这是一种可能的解决方法。@serafeim:另一种可能比memmaps更好的方法是重新构造代码,以分块处理数据,这样就避免了一次将所有内容加载到内存中的需要。@serafeim:另一种选择可能是为最终数组分配空间,一次实例化一个输入数组,然后使用for循环将输入数组注入最终数组。一个输入阵列只需要176GB以上的空间(约3GB)。由于一次实例化所有58个输入数组没有问题,因此执行上述操作可能没有问题。我已经编辑了上面的帖子来表达我的意思。