Например, у нас есть упорядоченный список:

a = [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]

Я хочу перестановить этот массив в форму:

a = [1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4]

В настоящее время я занимаюсь:

a = np.array([1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4])
n_unique_elements = 4
arrays_with_same_elements = np.array_split(a, 5)

for idx in range(n_unique_elements):
    final_list.append(list_similar_a[0][idx])
    final_list.append(list_similar_a[1][idx])
    final_list.append(list_similar_a[2][idx])
    final_list.append(list_similar_a[3][idx])
    final_list.append(list_similar_a[4][idx])

Так что переменная

final_list = [0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4] 

Должен быть pythonic способ сделать это. Возможно встроенная функция в numpy? Какие другие методы приходят вам на ум, чтобы решить эту проблему?

0
PPrasai 23 Июн 2019 в 19:22

5 ответов

Лучший ответ

Вы можете использовать параметр key в методе sort (): https://docs.python.org/3.3/howto/sorting. HTML # ключевые функции или же используя set ()

a = [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]
b = set(a)
final_list = list(b) * len(b)
1
Rambarun Komaljeet 23 Июн 2019 в 16:35

Итак, вы можете использовать NumPy:

a.reshape([4,3]).T.flatten()

Поэтому .reshape() помещает его в прямоугольную матрицу, затем .T переключает строки и столбцы, а .flatten() снова помещает его в линейный вектор

Теперь вам нужно только придумать параметры для изменения формы, например, {{Х0}}

1
Magellan88 23 Июн 2019 в 16:39

Попробуй это:

    a = np.array([1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4])
    uniqueValues, occurCount = np.unique(a, return_counts=True) # uniqueValues is the array of unique elements of main list
                                                                #occurCount is array containing frequency of unique elements
    common_occur=min(occurCount)                                # get frequency of co-occurrance

    final_array=np.tile(uniqueValues,common_occur)              #get tiled output array
0
RIMIL HEMBROM 23 Июн 2019 в 16:49

Если частота каждого элемента одинакова и известна заранее, это решение также будет работать

FREQ = 3
output = a[::FREQ] * (len(a) // FREQ)

Другое решение numpy:

FREQ = 3
output = a.reshape((-1, FREQ)).flatten(order='F')

Аргумент order='F' выравнивает матрицу по столбцам.

0
GZ0 23 Июн 2019 в 16:57

Попробуйте это: (чистый питон без внешней библиотеки)

STEP = 3
lst0 = [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]
lst1 = []

for x in range(0, STEP):
    for y in range(0, len(lst0), STEP):
        lst1.append(lst0[y + x])
print(lst1)

Выход

[1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4]
1
balderman 23 Июн 2019 в 16:43