如果我有一个numpy数组,例如:
[0,1,0,2,2]
我想同时翻转列表中的0和2(获得[2,1,2,0,0]
),最好的方法是什么?
答案 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
的解决方案。