带重复的Numpy大方阵

qgelzfjb  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(103)

我需要构造一个大的正方形N*M x N*M矩阵来与numpy.matmul一起使用。有很多重复,使得每个M x M正方形片段的元素重复N*N次。为了说明,对于M=2N=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_toreshape的组合来实现的。本质上,我试图将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的视图。

jm2pwxwz

jm2pwxwz1#

S不能创建为s的视图。NumPy数组需要一致的 strides -元素之间在内存中的距离必须沿维度保持沿着。将S创建为视图将需要在单个维度内重复更改strides。

相关问题