1 Câu hỏi: Python: Xáo trộn và đưa trở lại vào các phần tử thứ tự ban đầu của một mảng khó hiểu

câu hỏi được tạo ra tại Wed, May 8, 2019 12:00 AM

Tôi có một mảng mà tôi phải sửa đổi một số giá trị. Để làm như vậy, tôi phải thay đổi thứ tự các phần tử của mảng, sau khi đã thay đổi giá trị của nó, tôi muốn đặt các giá trị trở lại thứ tự ban đầu của chúng. Nhưng sau 2 giờ tôi thực sự không thể tìm ra cách.

Khi thay đổi thứ tự, tôi cần sắp xếp chúng từ phần tử lớn nhất đến phần tử nhỏ nhất theo giá trị tuyệt đối. Sau đó, tôi cần phải có tổng các phần tử là = thành 1 để tôi sửa đổi các phần tử nhưng sau đó không thể sắp xếp lại mảng.

Đây là mã của tôi:

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

Tôi biết rằng

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)))] 

Đây là mẹo nhưng sửa đổi các giá trị đầu ra không hoạt động. Vì vậy, bất kỳ trợ giúp hoặc gợi ý sẽ được đánh giá cao. Cảm ơn bạn rất nhiều

    
1
1 Câu trả lời                              1                         

Giải pháp thực sự là sắp xếp lại các vị trí của mảng được chuyển đổi theo các vị trí của đầu ra ban đầu, chứ không phải theo dõi các chỉ số được xáo trộn.

Giải pháp là:

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
nguồn đặt đây