1 Вопрос: Python: перемешать и вернуть в исходный порядок элементов массива NumPy

вопрос создан в Wed, May 8, 2019 12:00 AM

У меня есть массив, в котором я должен изменить некоторые значения. Для этого мне нужно изменить порядок элементов массива, после изменения его значений я хочу вернуть значения в их первоначальный порядок. Но через 2 часа мне действительно не удается выяснить, как.

При изменении порядка мне нужно отсортировать их от самого большого до самого маленького элемента по абсолютной величине. Затем мне нужно, чтобы сумма элементов была от = 1, поэтому я изменяю элементы, но тогда невозможно изменить порядок массива.

Это мой код:

output = np.random.uniform(-1, 1, (4, 1)).ravel()

sorted_weigths = np.sort(abs(output))[::-1]
sorted_indices = np.argsort(sorted_weigths)[::-1] 
signs = [i < 0 for i in output]  

if np.sum(abs(sorted_weigths)) > 1:
    alloc = 1
    for i in range(output.shape[0]):
        if alloc > abs(sorted_weigths[i]):
            sorted_weigths[i] = sorted_weigths[i]
            alloc = alloc - abs(sorted_weigths[i])
        elif alloc > 0:
            sorted_weigths[i] = alloc
            alloc = alloc - alloc
        else:
            sorted_weigths[i] = 0
else:
    pass

sorted_weigths[sorted_indices]

for i in range(len(signs)):
    if signs[i] == True:
        sorted_weigths[i] = -sorted_weigths[i]
    else:
        pass

Я знаю, что

output = np.random.uniform(-1, 1, (4, 1)).ravel()
sorted_weigths = np.sort(abs(output))
sorted_indices = np.argsort(sorted_weigths)
output[np.argsort(np.sort(abs(output)))] 

Это хитрость, но изменение значений вывода не работает. Так что любая помощь или намек будут высоко оценены. Большое спасибо

    
1
1 ответ                              1                         

Решение состоит в том, чтобы переупорядочить позиции преобразованного массива в соответствии с позициями исходного вывода, а не путем отслеживания перемешанных индексов.

Решение:

output = np.random.uniform(-1, 1, (4, 1)).ravel()

sorted_weigths = np.sort(abs(output))[::-1]
sorted_indices = np.argsort(abs(output))[::-1] 
signs = [i < 0 for i in output]  

if np.sum(abs(sorted_weigths)) > 1:
    alloc = 1
    for i in range(output.shape[0]):
        if alloc > abs(sorted_weigths[i]):
            sorted_weigths[i] = sorted_weigths[i]
            alloc = alloc - abs(sorted_weigths[i])
        elif alloc > 0:
            sorted_weigths[i] = alloc
            alloc = alloc - alloc
        else:
            sorted_weigths[i] = 0
else:
    pass

sorted_weigths_ = copy.deepcopy(sorted_weigths)
for i in range(sorted_indices.shape[0]):
    sorted_weigths_[sorted_indices[i]] = sorted_weigths[i]

for i in range(len(signs)):
    if signs[i] == True:
        sorted_weigths_[i] = -sorted_weigths_[i]
    else:
        pass

print(output)
print(sorted_weigths_)
    
0
2019-05-08 20: 38: 00Z
источник размещен Вот