同时在Numpy数组中翻转两个值

时间:2015-08-01 00:32:59

标签: python numpy

如果我有一个numpy数组,例如:

[0,1,0,2,2]

我想同时翻转列表中的0和2(获得[2,1,2,0,0]),最好的方法是什么?

3 个答案:

答案 0 :(得分:7)

这是numpy中条件的直接应用。

def switchvals(arr, val1, val2):
    mask1 = arr == val1
    mask2 = arr == val2
    arr[mask1] = val2
    arr[mask2] = val1

答案 1 :(得分:0)

我写了一个简单的函数来做到这一点。你传递两个数字和你希望数字翻转的矩阵,然后它返回新的矩阵。

    def flip(a,b,mat):
        NewMat=np.array(size(mat))
        for entry in range(len(mat)):
            if mat[entry]==a:
                NewMat[entry]=b
            else if mat[entry]==b:
                NewMat[entry]=a
            else:
                NewMat[entry]=mat[entry]
        return NewMat

答案 2 :(得分:0)

您可以对输入数组进行一些添加以获得所需的效果,如下面的代码所示 -

def flip_vals(A,val1,val2):

    # Find the difference between two values
    diff = val2 - val1

    # Scale masked portion of A based upon the difference value in positive 
    # and negative directions and add up with A to have the desired output
    return A + diff*(A==val1) - diff*(A==val2)

示例运行 -

In [49]: A = np.random.randint(0,8,(4,5))

In [50]: A
Out[50]: 
array([[0, 2, 3, 0, 3],
       [1, 5, 6, 6, 3],
       [1, 6, 7, 6, 4],
       [3, 7, 0, 3, 7]])

In [51]: flip_vals(A,3,6)
Out[51]: 
array([[0, 2, 6, 0, 6],
       [1, 5, 3, 3, 6],
       [1, 3, 7, 3, 4],
       [6, 7, 0, 6, 7]])

如果最好的话,你的意思是性能明智,我会选择其他基于logical indexing的解决方案。