0

所以我有一个矩阵,叫做 Vjunk,它是 70x70x70x70。我有另一个 70x70 的矩阵,称之为 V。

我想要做的是,对于每个 i, j 矩阵Vjunk[:,:,i,j]是 70 x 70。我想改变这个矩阵,以便它被它自己替换 +V[i,j]其中V[i,j]是我的矩阵 V 的第 ij 个元素。

我试过了

[Vjunk[:,:,i,j]=Vjunk[:,:,i,j]-beta*V[i,j] for i in range(humangrid_size) for j in range(assetgrid_size)]

但是这个命令没有成功。

4

2 回答 2

1

让我们在 Vjunk 上使用这个指数:(m, n, i, j)

如果我是正确的,您希望对于每个 m、n 组合,Vjunk(m,n,i,j) 被 Vjunk(m,n,i,j) -beta * V[i,j] 替换。如果这是目标,那么这个循环应该可以解决问题:

for m in range(70):
    for n in range(70):
        for i in range(70):
            for j in range(70):
                Vjunk[m,n,i,j] = Vjunk[m,n,i,j] - beta * V[i,j]

不知道它是否足够快,即使它只是一个 70*70*70*70 矩阵。仍然超过 20M 的操作。

i, j 上的循环可能会被列表理解所取代。

于 2017-08-31T13:06:30.607 回答
-1

首先,您不能将作业放在列表理解中。

其次:你很幸运,因为当你减去它们时VjunkV容易广播。这是一个使用非平凡形状的示例,可以更容易地发现错误:

import numpy as np

Vjunk = np.random.rand(2, 3, 4, 5) 
V = np.random.rand(4, 5) 

# naive version: loop
res1 = Vjunk.copy() 
for i in range(2): 
    for j in range(3): 
        for l in range(4): 
            for m in range(5): 
                res1[i,j,l,m] -= V[l,m]

# vectorized, broadcasting version:
res2 = Vjunk - V

print(np.array_equal(res1, res2))
# True

这里Vjunk有形(2, 3, 4, 5)V有形(4, 5)。后者与(1, 1, 4, 5)用于广播目的的形状兼容,然后与 的形状兼容Vjunk

执行广播减法Vjunk - V将完全按照您的要求进行:对于沿最后两个维度的每个元素Vjunk(沿其前两个维度的二维数组)的每个值将减少V.

然后加入一个标量因子是微不足道的:

res = Vjunk - beta * V
于 2020-05-11T18:10:21.027 回答