gpt4 book ai didi

python - Numpy 3D 数组索引 : Works for 2D, 如何为 3D 做?

转载 作者:太空宇宙 更新时间:2023-11-03 20:53:44 25 4
gpt4 key购买 nike

我有 3 numpy数组如下所示。

import numpy as np
key_idx = np.array([1, 2, 1]) # both have same shape
out_idx = np.array([0, 3, 0])
max_out = out_idx.max()
output = np.zeros(shape=(len(key_idx), max_out + 1))

# output =
# array([[0., 0., 0., 0.],
# [0., 0., 0., 0.],
# [0., 0., 0., 0.]])

我想增加索引给出的值,如下所示:

key_idx = key_idx[np.newaxis, :] # convert to 2D
out_idx = out_idx[np.newaxis, :]
idx = (key_idx, out_idx)
np.add.at(output, idx, 1)

# output =
# array([[0., 0., 0., 0.],
# [2., 0., 0., 0.],
# [0., 0., 0., 1.]])

然后按如下方式应用转换:

np.sum(np.amax(output, axis=1))
#3.0

但现在我想对 3D 输出数组执行此操作,其中 key_idx2D是一个二维数组,第一维表示 table_id 。请引用下图: enter image description here

我尝试过的

key_idx2D = np.array([[1, 2, 1], [2, 2, 2]])
output3D = np.zeros(shape=(key_idx2D.shape[0], len(key_idx), max_out + 1))
key_idx2D = key_idx[np.newaxis, :] # convert to 3D
out_idx = out_idx[np.newaxis, :]
idx3D = (key_idx2D, out_idx)
np.add.at(output3D, idx3D, 1)

#IndexError: index 2 is out of bounds for axis 0 with size 2

如何为 3D 案例执行此操作?任何帮助表示赞赏。它应该为每个table_id返回一个值数组。如图所示。

注意:我可以用循环来做到这一点,但会很慢。我需要更快的东西。

编辑: key_idx2Daxis 0 = table_idaxis 1 = key_idout_idxaxis 0 = out_id 。两者key_idx2Dout_idx仅包含 output 的索引ndarray 需要有 np.add.at()应用在他们身上。我更新了该图以澄清这一点。

最佳答案

我发布答案以防有人觉得有用。

key_idx2D = np.array([[1, 2, 1], [2, 2, 2]])
output3D = np.zeros(shape=(key_idx2D.shape[0], key_idx2D.shape[1], max_out + 1))
output3D.shape
#(2, 3, 4)

我所需要的只是为第一个轴(即轴 0)创建一个索引数组。

table_idx = np.array([0, 1]).reshape(-1, 1)
out_idx = np.array([0, 3, 0])
table_idx.shape, key_idx2D.shape, out_idx.shape
#((2, 1), (2, 3), (3,))

然后将所有索引数组以元组的形式发送到np.add.at

np.add.at(output3D, (table_idx, key_idx2D, out_idx), 1)
output3D

# array([[[0., 0., 0., 0.],
# [2., 0., 0., 0.],
# [0., 0., 0., 1.]],
# [[0., 0., 0., 0.],
# [0., 0., 0., 0.],
# [2., 0., 0., 1.]]])

np.sum(np.amax(output3D, axis=2), axis=1)
#array([3., 2.])

关于python - Numpy 3D 数组索引 : Works for 2D, 如何为 3D 做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56152860/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com