Изменить расположение строки в массиве numpy - PullRequest
0 голосов
/ 21 января 2019

У меня есть массив Numpy, который содержит строки.

index1 = ['level4','level3','level2','UNKNOWN','level1'] 

Я хочу расположить этот массив Numpy таким образом, чтобы 'UNKNOWN' всегда была первой строкой в ​​массиве.

Требуемый массив:

index1 = ['UNKNOWN','level4','level3','level2','level1']

Сортировка уровня нежелательна

Ответы [ 3 ]

0 голосов
/ 21 января 2019

partition () позволит изменить порядок вашего массива, но будет отсортирован.

index1.partition(np.where(index1=='UNKNOWN')[0][0])
0 голосов
/ 21 января 2019

Самый простой ответ

Если вы буквально просто хотите, чтобы 'UNKNOWN' был впереди, то самый простой и эффективный в вычислительном отношении способ сделать это - просто поменять его с элементом 0 th:

index1 = np.array(['level4','level3','level2','UNKNOWN','level1'])
# find the index of 'UNKNOWN'
ix = np.flatnonzero(index1 == 'UNKNOWN')[0]
# swap values
index1[[0, ix]] = index1[[ix, 0]]

print(index1)
# output:
#    ['UNKNOWN' 'level3' 'level2' 'level4' 'level1']

Сохранить исходный порядок элементов level

Если вы хотите, чтобы элементы level имели такой же порядок на выходе, как на входе, вот (немного сложнее)но все же довольно простой) способ сделать это:

index1 = np.array(['level4','level3','level2','UNKNOWN','level1'])
# find the index of 'UNKNOWN'
ix = np.flatnonzero(index1 == 'UNKNOWN')[0]
# shift values
u = index1[ix]
index1[1:ix + 1] = index1[:ix]
index1[0] = u

print(index1)
# output:
#    ['UNKNOWN' 'level4' 'level3' 'level2' 'level1']

Не используйте partition

Если вы не хотите, чтобы результаты сортировались, то вам не следуетиспользуйте numpy.partition:

index1 = np.array(['level4','level3','level2','UNKNOWN','level1'])
index1.partition(np.flatnonzero(index1 == 'UNKNOWN'))

print(index1)
# output:
#     ['UNKNOWN' 'level1' 'level2' 'level3' 'level4']
0 голосов
/ 21 января 2019

Вы можете использовать np.roll:

import numpy as np

index1 = np.array(['level4','level3','level2','UNKNOWN','level1'])

position = np.where(index1 == 'UNKNOWN')[0][0]
index1[:position + 1] = np.roll(index1[:position + 1], 1)
print(index1)

array(['UNKNOWN', 'level4', 'level3', 'level2', 'level1'], dtype='<U7')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...