我需要构造一个大的正方形N*M
x N*M
矩阵来与numpy.matmul
一起使用。有很多重复,使得每个M
x M
正方形片段的元素重复N*N
次。为了说明,对于M=2
和N=3
:
s = np.array([[1,2],
[3,4]])
S = np.array([1,2,1,2,1,2],
[3,4,3,4,3,4],
[1,2,1,2,1,2],
[3,4,3,4,3,4],
[1,2,1,2,1,2],
[3,4,3,4,3,4],)
字符串
这里的想法是将S
构造为s
的视图,以便使用更少的内存。这是我尝试使用broadcast_to
和reshape
的组合来实现的。本质上,我试图将M x M
矩阵“广播”到N*M x N*M
矩阵。
import numpy
N = 10000
M = 10
w = numpy.random.rand(N*M, 1)
s = numpy.random.rand(M, M)
S4d = numpy.broadcast_to(s, shape=(N, N, M, M))
S = S4d.reshape(N*M, N*M)
型
输出量:
numpy.core._exceptions._ArrayMemoryError: Unable to allocate 74.5 GiB for an array with shape (10000, 10000, 10, 10) and data type float64
型
有没有一种方法可以像上面描述的那样构造矩阵S
?
一种解决方法是编写一个函数来执行这种情况下的矩阵乘法。但是考虑到M ~ 1e3, N ~ 1e4
的实际值,我预计w' * S * w
将执行O(1e14)
操作,这将是缓慢的。
编辑我发现w' * S * w
可以分解为w
的切片与s
的乘法。整个乘积的计算时间仅为1秒多一点。然而,我仍然很好奇是否有一种方法可以将S
构造为s
的视图。
1条答案
按热度按时间jm2pwxwz1#
S
不能创建为s
的视图。NumPy数组需要一致的 strides -元素之间在内存中的距离必须沿维度保持沿着。将S
创建为视图将需要在单个维度内重复更改strides。