首页 > 解决方案 > 将 2D 矩阵的分布向量化为 3D 矩阵

问题描述

我有一个K形状为 (j, k) 的 2D 矩阵,我想通过根据与新的第一个维度匹配的Q另一个向量d(长度 i)分配向量来将其转换为 3D 矩阵。

我已经用循环完成了,但是该例程被调用了几次,整个过程花费了太长时间:

def shift(self, arr, num, init):
   result = np.zeros((arr.shape[0], arr.shape[1]), dtype=np.int32)
   offset = num + init
   result[offset:,:] = arr[:-offset,:]
   return result

q = np.zeros((i, j, k), dtype=np.int32)
q[0,:,:] = K

for i in range(len(d)):
    q[:, i, :] = shift(q[:, i, :], int(d[i]))

这里基本上我将初始矩阵复制K到 3D 矩阵的第一个维度的第一个元素中,该元素Q是使用np.zeros和最终维度创建的(d.shape + K.shape),然后我为维度 2 中的每个元素“推送”向量中的位置数d

有什么想法可以避免这种 for 循环吗?

标签: pythonarraysnumpymatrix

解决方案


对于您评论中的情况:

In [853]: v = [4, 6, 3, 8]; d = [9, 2, 3, 1]
In [865]: q = np.zeros((10,4), int)
In [866]: q[d,np.arange(4)]=v
In [867]: q
Out[867]: 
array([[0, 0, 0, 0],
       [0, 0, 0, 8],
       [0, 6, 0, 0],
       [0, 0, 3, 0],
       [0, 0, 0, 0],
       [0, 0, 0, 0],
       [0, 0, 0, 0],
       [0, 0, 0, 0],
       [0, 0, 0, 0],
       [4, 0, 0, 0]])

推荐阅读