连接两个大的 numpy 二维数组
Concatenate two big numpy 2D arrays
我有两个大的 numpy 二维数组。一种形状是 X1 (1877055, 1299),另一种是 X2 (1877055, 1445)。然后我使用
X = np.hstack((X1, X2))
将两个数组连接成一个更大的数组。但是,该程序不会 运行 并以代码 -9 退出。它没有显示任何错误消息。
问题是什么?如何连接这么大的两个 numpy 二维数组?
不是 numpy 专家,但为什么不使用 numpy.concatenate()
?
http://docs.scipy.org/doc/numpy/reference/generated/numpy.concatenate.html
例如:
>>> a = np.array([[1, 2], [3, 4]])
>>> b = np.array([[5, 6]])
>>> np.concatenate((a, b), axis=0)
array([[1, 2],
[3, 4],
[5, 6]])
>>> np.concatenate((a, b.T), axis=1)
array([[1, 2, 5],
[3, 4, 6]])
除非您的 NumPy 构建或 OS 有问题(两者都不太可能),否则这几乎可以肯定是内存错误。
例如,假设所有这些值都是 float64
。因此,您已经为这两个数组分配了至少 18GB 和 20GB 的空间,现在您正试图为串联的数组分配另外 38GB 的空间。但是你只有 64GB 的 RAM 加上 2GB 的交换空间。因此,没有足够的空间再分配 38GB。在某些平台上,这种分配只会失败,希望 NumPy 会捕获并引发 MemoryError
。在其他平台上,分配可能会成功,但一旦您尝试实际接触所有内存,您就会出现段错误(有关示例,请参见 linux 中的 overcommit handling)。在其他平台上,系统会尝试自动扩展交换空间,但是如果你的磁盘用完了 space,它就会出现段错误。
不管是什么原因,如果你不能同时将X1
、X2
和X
装入内存,你能做什么呢?
- 首先构建
X
,然后通过填充X
的切片视图来填充X1
和X2
。
- 将
X1
和 X2
写入磁盘,在磁盘上串联,然后读回它们。
- 将
X1
和 X2
发送到一个子进程,该子进程迭代读取它们并构建 X
然后继续工作。
我有两个大的 numpy 二维数组。一种形状是 X1 (1877055, 1299),另一种是 X2 (1877055, 1445)。然后我使用
X = np.hstack((X1, X2))
将两个数组连接成一个更大的数组。但是,该程序不会 运行 并以代码 -9 退出。它没有显示任何错误消息。
问题是什么?如何连接这么大的两个 numpy 二维数组?
不是 numpy 专家,但为什么不使用 numpy.concatenate()
?
http://docs.scipy.org/doc/numpy/reference/generated/numpy.concatenate.html
例如:
>>> a = np.array([[1, 2], [3, 4]])
>>> b = np.array([[5, 6]])
>>> np.concatenate((a, b), axis=0)
array([[1, 2],
[3, 4],
[5, 6]])
>>> np.concatenate((a, b.T), axis=1)
array([[1, 2, 5],
[3, 4, 6]])
除非您的 NumPy 构建或 OS 有问题(两者都不太可能),否则这几乎可以肯定是内存错误。
例如,假设所有这些值都是 float64
。因此,您已经为这两个数组分配了至少 18GB 和 20GB 的空间,现在您正试图为串联的数组分配另外 38GB 的空间。但是你只有 64GB 的 RAM 加上 2GB 的交换空间。因此,没有足够的空间再分配 38GB。在某些平台上,这种分配只会失败,希望 NumPy 会捕获并引发 MemoryError
。在其他平台上,分配可能会成功,但一旦您尝试实际接触所有内存,您就会出现段错误(有关示例,请参见 linux 中的 overcommit handling)。在其他平台上,系统会尝试自动扩展交换空间,但是如果你的磁盘用完了 space,它就会出现段错误。
不管是什么原因,如果你不能同时将X1
、X2
和X
装入内存,你能做什么呢?
- 首先构建
X
,然后通过填充X
的切片视图来填充X1
和X2
。 - 将
X1
和X2
写入磁盘,在磁盘上串联,然后读回它们。 - 将
X1
和X2
发送到一个子进程,该子进程迭代读取它们并构建X
然后继续工作。