Permute Rows And Columns Of A Matrix
Solution 1:
You can perform the swap in a one-liner using integer array indexing:
a = np.array([[0, 0, 1, 1, 1],
[0, 0, 1, 0, 1],
[1, 1, 0, 1, 1],
[1, 0, 1, 0, 0],
[1, 1, 1, 0, 0]])
b = a.copy()
# map 0 -> 4and1 -> 3 (N.B. Python indexing starts at 0 rather than 1)
a[[4, 3, 0, 1]] = a[[0, 1, 4, 3]]print(repr(a))
# array([[1, 1, 1, 0, 0],
# [1, 0, 1, 0, 0],
# [1, 1, 0, 1, 1],
# [0, 0, 1, 0, 1],
# [0, 0, 1, 1, 1]])
Note that array indexing always returns a copy rather than a view - there's no way to swap arbitrary rows/columns of an array without generating a copy.
In this particular case you could avoid the copy by using slice indexing, which returns a view rather than a copy:
b = b[::-1] # invert the row orderprint(repr(b))
# array([[1, 1, 1, 0, 0],# [1, 0, 1, 0, 0],# [1, 1, 0, 1, 1],# [0, 0, 1, 0, 1],# [0, 0, 1, 1, 1]])
Update:
You can use the same indexing approach to swap columns.
c= np.arange(25).reshape(5,5)
print(repr(c))# array([[ 0, 1, 2, 3, 4],# [ 5, 6, 7, 8, 9],# [10, 11, 12, 13, 14],# [15, 16, 17, 18, 19],# [20, 21, 22, 23, 24]])c[[0,4],:]=c[[4,0],:]# swap row 0 with row 4...c[:,[0,4]]=c[:,[4,0]]# ...and column 0 with column 4
print(repr(c))# array([[24, 21, 22, 23, 20],# [ 9, 6, 7, 8, 5],# [14, 11, 12, 13, 10],# [19, 16, 17, 18, 15],# [ 4, 1, 2, 3, 0]])
I've used a different example array in this case - your version will yield an identical output after performing the row/column swaps which makes it difficult to understand what's going on.
Solution 2:
I found a solution to do what I want (though it is expensive):
a2 = deepcopy(a1)
first= randint(0, 5, 10)
second= randint(0, 5, 10)
for i inrange(len(first)):
a = deepcopy(a2)
a2[first[i],:] = a[second[i],:]
a2[second[i],:] = a[first[i],:]
for i inrange(len(first)):
a = deepcopy(a2)
a2[:,first[i]] = a[:,second[i]]
a2[:,second[i]] = a[:,first[i]]
Basically, I am doing 10 random switches. However, I need to copy the matrix many times. Anyway, a2 now represents a graph which is isomorphic with a1.
Post a Comment for "Permute Rows And Columns Of A Matrix"