numpy 将一个数组中的符号替换为另一个数组的符号的补码

goucqfw6  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(121)

假设两个正方形数组ab具有相同的形状。在这个例子中,ab都有6行6列。ab的每一行和每一列都保存值1、2、3、4、5、6。
a中,一些元素被设置为负数,如图所示,作为早期过程的一部分('-'元素的数量并不重要)。在b中,所有元素都是“+”。

a = np.array([[-1, -3, -5, -6,  4,  2],
              [-2, -4,  6,  5,  3, -1],
              [ 5, -6,  1,  3, -2, -4],
              [ 6, -2, -4, -1,  5,  3],
              [ 4,  5, -3, -2,  1, -6],
              [ 3, -1,  2,  4,  6, -5]])   

b = np.array([[ 4,  3,  1,  5,  6,  2],
              [ 5,  4,  2,  3,  1,  6],
              [ 3,  6,  5,  2,  4,  1],
              [ 1,  2,  4,  6,  5,  3],
              [ 2,  1,  6,  4,  3,  5],
              [ 6,  5,  3,  1,  2,  4]])

我需要为b中的元素分配符号,这些元素是a中相应元素符号的补数
即:在a的第1列中,1和2为,3至6为。因此,在'b'的第一列中,1和2必须保持为,3到6必须为。对于ab的每个对应列重复该方法。最后的结果看起来像这样:

b = np.array([[-4,  3, -1, -5, -6, -2],
              [-5,  4, -2, -3, -1,  6],
              [-3,  6,  5,  2, -4,  1],
              [ 1,  2,  4,  6, -5, -3],
              [ 2,  1, -6, -4, -3,  5],
              [-6, -5,  3,  1,  2,  4]])

问:是否有一种有效的方法来分配符号b以这种方式?(实际的数组更大,数量非常多)

xzv2uavs

xzv2uavs1#

假设每个1-6的绝对数在每列中只出现一次。
您可以按绝对值对列进行排序,复制符号,然后将排序反转为原始状态。
使用argsorttake_along_axissign

# sorter for a by absolute value
idxa = np.argsort(abs(a), axis=0)
# reverse sorter from sorted to order in b
idxb = np.argsort(np.argsort(b, axis=0), axis=0)

# sort a, reorder it like b, copy sign
out = (b*
       np.take_along_axis(
        -np.sign(np.take_along_axis(a, idxa, axis=0)),
        idxb, axis=0)
       )

输出量:

array([[-4,  3, -1, -5, -6, -2],
       [-5,  4, -2, -3, -1,  6],
       [-3,  6,  5,  2, -4,  1],
       [ 1,  2,  4,  6, -5, -3],
       [ 2,  1, -6, -4, -3,  5],
       [-6, -5,  3,  1,  2,  4]])

相关问题