[英]Apply 1D array representing index to element translation over 2D array of index values?
我有一个二维数组
arr = np.array([
[ 1, 2, -1, -1],
[ 0, 1, -1, -1],
[ 3, 5, -1, -1],
[ 7, 8, -1, -1],
[ 6, 7, -1, -1],
[ 9, 11, -1, -1]])
它的元素与其他一些数组的索引相关。 -1
值表示“无索引”。 我还将arr
中的元素转换为其他值(不同数组的索引),形式为
trans = np.array([[ 0],
[-1],
[ 1],
[-1],
[ 2],
[-1],
[ 3],
[-1],
[ 4],
[-1],
[ 5],
[-1]])
这里trans
的第n
个元素表示arr
中的元素值到trans
的元素值的映射。 例如, arr
中的8
应转换为值4
( trans[8]
== 4
)。
我如何应用trans
来翻译arr
的值?
所需 output
np.array([
[-1, 1, -1, -1],
[0, -1, -1, -1],
[-1, -1, -1, -1],
[-1, 4, -1, -1],
[3, -1, -1, -1],
[-1, -1, -1, -1]
])
只需展平trans
,并用arr
索引它。 请注意,这会导致arr
中为-1
的条目被翻译为trans
中的最后一个条目。 要解决此问题,您可以手动将-1
分配给arr
中为-1
的所有条目:
result = trans.flat[arr]
result[arr == -1] = -1
print(repr(result))
产出
array([[-1., 1., -1., -1.],
[ 0., -1., -1., -1.],
[-1., -1., -1., -1.],
[-1., 4., -1., -1.],
[ 3., -1., -1., -1.],
[-1., -1., -1., -1.]])
请注意,结果将具有trans
的数据类型。
如果您想避免对arr
中-1
条目的trans
最后一个元素进行不必要的查找(如本答案所示),您可以改为创建arr
的副本,然后使用类似的索引仅更新非-1
条目:
result = arr.copy()
has_index = arr != -1
result[has_index] = trans.flat[arr[has_index]].flat
print(repr(result))
哪个输出
array([[-1, 1, -1, -1],
[ 0, -1, -1, -1],
[-1, -1, -1, -1],
[-1, 4, -1, -1],
[ 3, -1, -1, -1],
[-1, -1, -1, -1]])
请注意,结果将具有arr
的数据类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.