如何在Python中为每个2D横截面填充带有2D矩阵的4D矩阵

时间:2017-08-31 12:52:14

标签: python matrix numpy-broadcasting

所以我有一个矩阵调用它是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)]

但是这个命令不成功。

2 个答案:

答案 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)

首先,您不能将任务放在列表理解中。

第二个:您很幸运,因为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(沿其前两个维度的2d数组)的每个值将减少{ {1}}。

然后添加标量因子很简单:

V