Сортировка значений по индексам по размеру без потери информации о структуре - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть, например, 5 массивов. Есть случайные числа. Теперь я хочу знать, по какому показателю (5,6,4) какой a имеет наибольшее значение. Какой второй по величине, а какой третий ..

У вас есть идея, как это сделать?

import numpy as np
import random

a1 = np.random.rand(5,6,4)
a2 = np.random.rand(5,6,4)
a3 = np.random.rand(5,6,4)
a4 = np.random.rand(5,6,4)
a5 = np.random.rand(5,6,4)

list = [a1,a2,a3,a4,a5]

for i in list:

В конце я хочу получить новый массив, такой как b1 с размерностью ( 5,6,4), который имеет в каждом индексе a_i с наибольшим значением. Как b1 = [[a2, a5, a3 ...], [a2, a2, a2, ..]] и b2 второй по величине .. и т. д.

У вас есть идея?

Ответы [ 2 ]

1 голос
/ 05 февраля 2020
In [15]: a1=np.random.randint(0,10,(2,3,4))                                                    
In [16]: a2=np.random.randint(0,10,(2,3,4))                                                    
In [17]: a3=np.random.randint(0,10,(2,3,4))                                                    

Соберите их в один массив (по новой оси) и возьмите максимум вдоль новой оси.

In [18]: aa = np.array([a1,a2,a3])                                                             
In [19]: aa                                                                                    
Out[19]: 
array([[[[6, 2, 1, 2],
         [7, 6, 5, 2],
         [0, 4, 2, 5]],

        [[9, 1, 5, 3],
         [2, 5, 0, 5],
         [2, 2, 2, 7]]],


       [[[5, 2, 7, 1],
         [7, 7, 9, 8],
         [6, 3, 2, 9]],

        [[0, 1, 2, 3],
         [0, 3, 6, 1],
         [5, 2, 7, 9]]],


       [[[1, 9, 3, 3],
         [6, 5, 7, 4],
         [8, 0, 4, 4]],

        [[8, 1, 1, 8],
         [8, 5, 4, 8],
         [3, 3, 9, 0]]]])
In [20]: np.max(aa, axis=0)                                                                    
Out[20]: 
array([[[6, 9, 7, 3],
        [7, 7, 9, 8],
        [8, 4, 4, 9]],

       [[9, 1, 5, 8],
        [8, 5, 6, 8],
        [5, 3, 9, 9]]])

Я позволю вам проверить значения.

argmax сообщает нам, какой массив является самым большим в 3d-слоте:

In [21]: np.argmax(aa, axis=0)                                                                 
Out[21]: 
array([[[0, 2, 1, 2],
        [0, 1, 1, 1],
        [2, 0, 2, 1]],

       [[0, 0, 0, 2],
        [2, 0, 1, 2],
        [1, 2, 2, 1]]])
0 голосов
/ 05 февраля 2020

Используйте numpy maximum, это вернет максимальные значения для каждой позиции при сравнении 2 массивов, а numpy minimum вернет минимальные значения.

import numpy as np

a1 = np.random.rand(5,6,4)
a2 = np.random.rand(5,6,4)
a3 = np.random.rand(5,6,4)
a4 = np.random.rand(5,6,4)
a5 = np.random.rand(5,6,4)

list = [a1,a2,a3,a4,a5]

# collect results
max_array = np.random.rand(5,6,4)
min_array = np.random.rand(5,6,4)
for i in range(0,4,1):
    max_array = np.maximum(list[i], max_array)
    min_array = np.minimum(list[i], min_array)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...