所以我有一个矩阵调用它是Vjunk,它是70x70x70x70。我有另一个矩阵,70x70称之为V。
我想做的是,对于每个i,j矩阵Vjunk [:,:,i,j]是70乘70.我想改变这个矩阵,以便它被自己替换+ V [i,j其中V [i,j]是我的矩阵V的第i个元素。
我试过了 [Vjunk [:,:,i,j] = Vjunk [:,:,i,j] -beta * V [i,j] for i in range(humangrid_size)for j in range(assetgrid_size)]
但是这个命令不成功。
答案 0 :(得分:0)
让我们在Vjunk上使用这个指标:(m,n,i,j)
如果我是正确的,你想要每m,n组合,Vjunk(m,n,i,j)被Vjunk(m,n,i,j)替换为-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]
Dunno,如果它足够快,即使它只是一个70 * 70 * 70 * 70矩阵。仍然超过20M的运营。
i,j上的循环可能会被列表理解所取代。
答案 1 :(得分:-1)
首先,您不能将任务放在列表理解中。
第二个:您很幸运,因为Vjunk
和V
减去后很容易广播。这是一个具有非平凡形状的示例,可以更轻松地发现错误:
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
(沿其前两个维度的2d数组)的每个值将减少{ {1}}。
然后添加标量因子很简单:
V