получить максимальное значение по указанной c оси с условием в трехмерном массиве - PullRequest
1 голос
/ 10 июля 2020

Кажется, действительно проблема в python. np.amax - это также быстрый способ получить максимальное значение по любой оси. Теперь я хочу то же самое, но для значений, отличных от 0 (то есть с условием). Итак, мне нужно найти максимальное значение по оси, если это значение больше или меньше 0.

Я ничего не нашел и np.where не подходит для указанной оси c Я выяснил . И он также очень медленный.

Что такое pythoni c и простой и, возможно, быстрый способ решить указанную выше проблему?

Пример

a= [[[1,0,-3,8],[4,-1,0,-4],[1,-2,-3,8],[4,1,-2,4], [-4,-1,-2,0]],[[3,0, 0,-8],[4,3,2,5],[1,2,3,8],[4,1,2,4], [4,1,2,4]]]

Я хочу чтобы получить максимальное значение по последней оси (axis=2).

Итак, выше вы видите элемент [-4,-1,-2,0]. Это даст с np.amax только 0. Но в моем случае я хочу игнорировать все 0 и получить в этом случае значение -1. ​​

Спасибо!

Ответы [ 2 ]

1 голос
/ 10 июля 2020

Использовать замаскированный массив:

a = np.ma.masked_array(a, mask=a==0)
a.max(2)

вывод:

[[8 4 8 4 -1]
 [3 5 8 4 4]]
0 голосов
/ 10 июля 2020

Вы можете использовать замаскированный массив.

максимальное количество чисел <0 </strong> (хотя теперь я вижу, что это не тот вопрос, который вы задавали - см. «Обновление» ниже )

import numpy as np
import numpy.ma as ma

a = np.array(
    [[[1,0,-3,8], [4,-1,0,-4], [1,-2,-3,8], [4,1,-2,4], [-4,-1,-2,0]],
     [[3,0, 0,-8], [4,3,2,5], [1,2,3,8], [4,1,2,4], [4,1,2,4]]]
)

a_masked = ma.array(a, mask=(a >= 0))  # mask off any values >= 0

print(np.max(a_masked, axis=2))  # max of non-masked values (if any)

дает

[[-3 -1 -2 -2 -1]
 [-8 -- -- -- --]]

максимальное количество чисел> 0 (аналогично)

Кому получить максимум любых значений> 0, вы бы сделали то же самое, но со значениями <=0 замаскировано

a_masked = ma.array(a, mask=(a <= 0))

Это дает:

[[8 4 8 4 --]
 [3 5 8 4 4]]

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

Обновление

Спасибо Ehsan за указание на то, что я неправильно понял вопрос. Вы спрашивали о максимуме чисел больше или меньше нуля - почему-то я неправильно понял это, задав два вопроса:

  • максимум чисел больше нуля
  • максимум чисел меньше ноль

отсюда

Теперь я понимаю, что вы задаете единственный вопрос:

  • максимум чисел больше или меньше (т.е. не равно) нулю

Следовательно, конечно, просто измените условие маски:

a_masked = ma.array(a, mask=(a == 0))  # mask off any values == 0

дает это время:

[[8 4 8 4 -1]
 [3 5 8 4 4]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...