Python 在多维数组中建立索引
Python indexing in multidimentional array
我有一个 4D numpy 数组 letterOrder(形状为 2 x 3 x 5 x 4),我想使用每个单元格作为坐标来查找矩阵 ov 中的值。
letterOrder = np.array(
[[[[4, -1, -1, 2],
[-1, -1, -1, -1],
[-1, -1, -1, -1],
[-1, -1, -1, -1],
[3, -1, -1, -1]],
[[4, -1, -1, -1],
[-1, -1, -1, -1],
[-1, -1, -1, -1],
[4, -1, -1, -1],
[-1, -1, -1, -1]],
[[-1, -1, -1, -1],
[-1, -1, -1, -1],
[-1, -1, -1, -1],
[-1, -1, -1, -1],
[-1, -1, -1, -1]]],
[[[-1, -1, -1, -1],
[-1, -1, -1, -1],
[3, -1, -1, -1],
[2, -1, -1, -1],
[-1, -1, -1, -1]],
[[4, -1, -1, -1],
[4, -1, -1, -1],
[-1, -1, -1, -1],
[-1, -1, -1, -1],
[-1, -1, -1, -1]],
[[0, -1, -1, -1],
[4, -1, -1, -1],
[-1, -1, -1, -1],
[-1, -1, -1, -1],
[-1, -1, -1, -1]]]], dtype = int)
nData = letterOrder.shape[0]
LL = letterOrder.shape[1]
maxLength = letterOrder.shape[2]
maxCount = letterOrder.shape[3]
ov = np.array(
[[0.603, 0.235, 0.104, 0.034, 0.008],
[0.193, 0.334, 0.22 , 0.108, 0.037],
[0.005, 0.235, 0.283, 0.215, 0.11 ],
[0. , 0.082, 0.22 , 0.27 , 0.212],
[0. , 0.014, 0.104, 0.215, 0.265],
[0. , 0. , 0. , 0. , 0. ]]) # shaped as (maxLength + 1, maxLength)
sims = np.zeros((nData, LL, maxLength))
for i in np.arange(maxCount):
sims += ov[letterOrder[:,:,np.arange(maxLength),i], np.arange(maxLength)]
我试图计算“sims”而不必遍历每个维度,并设法将它们减少到单个 for 循环。
我想知道是否有一种方法可以让我在没有任何 for 循环的情况下一次计算所有“模拟人生”?
你可以试试这个:
sims = ov[letterOrder, np.arange(maxLength).reshape(-1, 1)].sum(-1)
我有一个 4D numpy 数组 letterOrder(形状为 2 x 3 x 5 x 4),我想使用每个单元格作为坐标来查找矩阵 ov 中的值。
letterOrder = np.array(
[[[[4, -1, -1, 2],
[-1, -1, -1, -1],
[-1, -1, -1, -1],
[-1, -1, -1, -1],
[3, -1, -1, -1]],
[[4, -1, -1, -1],
[-1, -1, -1, -1],
[-1, -1, -1, -1],
[4, -1, -1, -1],
[-1, -1, -1, -1]],
[[-1, -1, -1, -1],
[-1, -1, -1, -1],
[-1, -1, -1, -1],
[-1, -1, -1, -1],
[-1, -1, -1, -1]]],
[[[-1, -1, -1, -1],
[-1, -1, -1, -1],
[3, -1, -1, -1],
[2, -1, -1, -1],
[-1, -1, -1, -1]],
[[4, -1, -1, -1],
[4, -1, -1, -1],
[-1, -1, -1, -1],
[-1, -1, -1, -1],
[-1, -1, -1, -1]],
[[0, -1, -1, -1],
[4, -1, -1, -1],
[-1, -1, -1, -1],
[-1, -1, -1, -1],
[-1, -1, -1, -1]]]], dtype = int)
nData = letterOrder.shape[0]
LL = letterOrder.shape[1]
maxLength = letterOrder.shape[2]
maxCount = letterOrder.shape[3]
ov = np.array(
[[0.603, 0.235, 0.104, 0.034, 0.008],
[0.193, 0.334, 0.22 , 0.108, 0.037],
[0.005, 0.235, 0.283, 0.215, 0.11 ],
[0. , 0.082, 0.22 , 0.27 , 0.212],
[0. , 0.014, 0.104, 0.215, 0.265],
[0. , 0. , 0. , 0. , 0. ]]) # shaped as (maxLength + 1, maxLength)
sims = np.zeros((nData, LL, maxLength))
for i in np.arange(maxCount):
sims += ov[letterOrder[:,:,np.arange(maxLength),i], np.arange(maxLength)]
我试图计算“sims”而不必遍历每个维度,并设法将它们减少到单个 for 循环。 我想知道是否有一种方法可以让我在没有任何 for 循环的情况下一次计算所有“模拟人生”?
你可以试试这个:
sims = ov[letterOrder, np.arange(maxLength).reshape(-1, 1)].sum(-1)