繁体   English   中英

将表示索引的一维数组应用于索引值二维数组的元素转换?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM