Поменяйте местами массивы в массиве 2d на основе его содержимого - PullRequest
0 голосов
/ 27 декабря 2018

У меня есть пустой массив

a = ([[1,2,3],
      [2,2,2],
      [1,5,3],
      [3,3,1]])


swap1 = [2,2,2]

swap2 = [3,3,1]

Я хочу поменять местами строки, которые равны swap1 и swap2, не зная об индексе этих 2 строк.Я хочу, чтобы результат выглядел следующим образом

Out = ([[1,2,3],
        [3,3,1],
        [1,5,3],
        [2,2,2]])

Каков наилучший способ сделать это?Я хочу избежать петель, если это вариант.Спасибо!

Ответы [ 5 ]

0 голосов
/ 27 декабря 2018
import numpy as np
ar=np.array([[1,2,3],[2,2,2],[1,5,3],[3,3,1]])
swap1 = [2,2,2]

swap2 = [3,3,1]
def swapfunc( x ):
    if (x==swap2).all():
        return swap1
    else:
        return x

ar=np.apply_along_axis( swapfunc, axis=1, arr=ar )
print(ar)

Выход

[[1 2 3]
 [2 2 2]
 [1 5 3]
 [2 2 2]]
0 голосов
/ 27 декабря 2018

использовать карту очень просто.

a = map(lambda x:([3,3,1]) if x == [2,2,2] else ([2,2,2] if x == [3,3,1] else x), a)

или (в соответствии с вашими переменными)

a = map(lambda x:(swap2) if x == swap1 else (swap1 if x == swap2 else x), a)

не видите циклов, один вкладыш и вы получите свой результат

Результат.

[[1, 2, 3], [3, 3, 1], [1, 5, 3], [2, 2, 2]]
0 голосов
/ 27 декабря 2018
>>> a = np.array([[1,2,3],
      [2,2,2],
      [1,5,3],
      [3,3,1]])
>>> x = [2,2,2]
>>> y = [3,3,1]

Создайте логический массив интересующих вас строк

>>> xmask = np.all(a==x,axis=1)
>>> ymask = np.all(a==y,axis=1)
>>> xmask
array([False,  True, False, False])
>>> ymask
array([False, False, False,  True])

Затем используйте их для изменения значений

>>> a[xmask] = y
>>> a[ymask] = x
>>> a
array([[1, 2, 3],
       [3, 3, 1],
       [1, 5, 3],
       [2, 2, 2]])
>>>

Если массив равен квадрат

>>> a = np.array([[1,2,3,4],
      [2,2,2,9],
      [1,5,3,1],
      [3,3,1,8]])
>>> y = [3,3,1,8]
>>> x = [2,2,2,9]
>>> xmask = np.all(a==x,axis=1)
>>> ymask = np.all(a==y,axis=1)
>>> a[xmask,:] = y
>>> a[ymask,:] = x

логическое индексирование

0 голосов
/ 27 декабря 2018

Мое решение работает по всему списку, если это то, что вам нужно, все в порядке.

def list_swap(a, swap1, swap2):
# Running on the list
for list in a:
    if (list == swap1):
        list = swap2
    else if (list == swap2):
        list = swap1

В python вы можете сравнивать списки, так что есть простая функция, которая работает в списке и меняет значения, еслией нужно.

0 голосов
/ 27 декабря 2018

Для массива numy:

import numpy as np

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

swap1 = [2,2,2]
swap2 = [3,3,1]

id1 = np.where(np.all(a == swap1, axis = 1))
id2 = np.where(np.all(a == swap2, axis = 1))

a[id2], a[id1] = a[id1], a[id2]

print(a)
# [[1 2 3]
#  [3 3 1]
#  [1 5 3]
#  [2 2 2]]


Для списка:
idxs = [ [idx, e] for idx, e in enumerate(a) if e == swap1 or e == swap2 ]
idxs[0][0], idxs[1][0] = idxs[1][0], idxs[0][0]

for i in idxs:
  a[i[0]] = i[1]
print(a)

#=> [[1, 2, 3], [3, 3, 1], [1, 5, 3], [2, 2, 2]]
...