连接两个较大的numpy二维数组

3

我有两个大的numpy 2D数组。一个形状为X1(1877055,1299),另一个为X2(1877055,1445)。然后我使用

X = np.hstack((X1, X2))

要将这两个数组连接成一个更大的数组。 但是,程序无法运行并退出,错误代码为-9,它没有显示任何错误消息。

问题是什么?我如何连接这两个大的numpy二维数组?


示例数据? 浮点数还是整数? 这在小数组上是否有效? 在单精度下,X大约为20GB,因此根据您的RAM情况,在最好的情况下这可能会非常缓慢。 - JohnE
这里可能有三个问题:(1)您正在使用32位Python,而32位虚拟内存空间(2-4GB)不足以将X1X2X全部放入其中。(2)您正在使用64位Python,但实际内存不足以容纳它们所有。(3)您的NumPy安装已损坏。所以,首先,您是否在32位Python上?什么dtype?您有多少内存?您是如何安装NumPy的,有哪个版本?还有什么平台? - abarnert
更简单的方法是打印出 X1.nbytesX2.nbytes,这样我们就不必猜测你使用了多少内存。 - abarnert
无论如何,这几乎肯定是一个内存错误,但您没有提供足够的信息来诊断它。我的第一个猜测是您正在使用一个具有大约64-68GB物理RAM +交换的Linux系统,并且您的dtype为float64,因此在已经使用38GB之后,您试图分配另外38GB,而内核允许您超额承诺,但之后您会出现段错误,因为您实际上尝试使用所有76GB。 - abarnert
谢谢@abarnert,问题出在内存! - Excalibur
2个回答

8
除非您的NumPy构建或操作系统出现问题(这两种情况都不太可能),否则这几乎肯定是内存错误。
例如,假设所有这些值都是float64。因此,您已经为这两个数组分配了至少18GB和20GB,并且现在正在尝试为连接的数组分配另外38GB。但是,您只有64GB的RAM加上2GB的交换空间。因此,没有足够的空间来分配另外38GB。在某些平台上,此分配将会失败,希望NumPy会捕获并引发MemoryError。在其他平台上,分配可能会成功,但是一旦您尝试实际触摸所有该内存,您将会出现段错误(请参见Linux中的overcommit handling示例)。在其他平台上,系统将尝试自动扩展交换空间,但是如果您的磁盘空间不足,则会出现段错误。
无论原因是什么,如果您无法同时将X1X2X放入内存中,那么您可以做什么呢?
  • 首先只需构建X,然后通过填充X的切片视图来填充X1X2
  • X1X2写入磁盘,连接它们,并重新读取。
  • X1X2发送到一个子进程中,该子进程会迭代地读取它们并构建X,然后继续工作。

我认为你是正确的!这就是问题,它们太大了!!谢谢!我会尝试你的方法。 - Excalibur

-3

3
concatenatehstack的作用完全相同。事实上,hstack文档甚至说它们是等价的。因此,这并没有什么帮助。 - abarnert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接