Как я могу поменять список в матрице в Python? - PullRequest
0 голосов
/ 15 ноября 2018

Я хочу перетасовать строки 3D-матрицы, но она не работает в матрице. Вот пример кода

def shuffle(data,data_size):
    for step in range(int(1*data_size)):
        selected = int(np.random.uniform(0,data_size))
        target = int(np.random.uniform(0,data_size))   

        print(data)
        if selected!=target:
            data[selected], data[target] = data[target], data[selected]            

            print(selected," and ",target, " are changed")
    return data

data = [[[1,2,3,4],[1,2,3,5],[1,2,3,6]],
        [[2,2,3,4],[2,2,3,5],[2,2,3,6]],
        [[3,2,3,4],[3,2,3,5],[3,2,3,6]] ]

data = np.array(data)
data = shuffle(data,3)

, в этом коде я хочу перетасовать данные из одного списка строк в другой список строк

но это результат не работает подкачка, но перезапись

вот результат

[[[1 2 3 4]
  [1 2 3 5]
  [1 2 3 6]]

 [[2 2 3 4]
  [2 2 3 5]
  [2 2 3 6]]

 [[3 2 3 4]
  [3 2 3 5]
  [3 2 3 6]]]
2  and  1  are changed
[[[1 2 3 4]
  [1 2 3 5]
  [1 2 3 6]]

 [[2 2 3 4]
  [2 2 3 5]
  [2 2 3 6]]

 [[2 2 3 4]
  [2 2 3 5]
  [2 2 3 6]]]
1  and  0  are changed
[[[1 2 3 4]
  [1 2 3 5]
  [1 2 3 6]]

 [[1 2 3 4]
  [1 2 3 5]
  [1 2 3 6]]

 [[2 2 3 4]
  [2 2 3 5]
  [2 2 3 6]]]
0  and  2  are changed
[[[2 2 3 4]
  [2 2 3 5]
  [2 2 3 6]]

 [[1 2 3 4]
  [1 2 3 5]
  [1 2 3 6]]

 [[2 2 3 4]
  [2 2 3 5]
  [2 2 3 6]]]
2  and  1  are changed

как я могу поменять список в матрице?

спасибо

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Если вы хотите перетасовать по первой оси, просто используйте np.random.shuffle:

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

np.random.shuffle(data)
print(data)

Выход:

[[[3 2 3 4]
  [3 2 3 5]
  [3 2 3 6]]

 [[1 2 3 4]
  [1 2 3 5]
  [1 2 3 6]]

 [[2 2 3 4]
  [2 2 3 5]
  [2 2 3 6]]]

Если вы хотите перетасовать по любой другой оси в data, вы можете перетасовать представление массива, возвращаемое np.swapaxes. Например, чтобы перетасовать строки внутренних 2D матриц, выполните:

swap = np.swapaxes(data, 1, 0)
np.random.shuffle(swap)
print(data)

Выход:

[[[1 2 3 6]
  [1 2 3 4]
  [1 2 3 5]]

 [[2 2 3 6]
  [2 2 3 4]
  [2 2 3 5]]

 [[3 2 3 6]
  [3 2 3 4]
  [3 2 3 5]]]
0 голосов
/ 15 ноября 2018
import numpy as np

def shuffle(data,data_size):
    for step in range(int(1*data_size)):
        selected = int(np.random.uniform(0,data_size))
        target = int(np.random.uniform(0,data_size))   

        print(data)
        if selected!=target:

            data[[selected, target]] = data[[target, selected]]      

            print(selected," and ",target, " are changed")
    return data

data = [[[1,2,3,4],[1,2,3,5],[1,2,3,6]],
        [[2,2,3,4],[2,2,3,5],[2,2,3,6]],
        [[3,2,3,4],[3,2,3,5],[3,2,3,6]] ]

data = np.array(data)
data = shuffle(data,3)
...