#python #arrays #python-3.x #masked-array
#python #массивы #python-3.x #masked-array
Вопрос:
Я хочу вычислить медиану массива замаскированного массива. Нет проблем с вычислением среднего значения, но ошибка возрастает, когда я хочу вычислить медиану, и я не знаю почему:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
Вот минимальный пример, который воспроизводит проблему:
import numpy as np
import numpy.mask as ma
test = ma.masked_array([[1,2,3,4],[5,6,7,8]], mask = [[False,False,False,False],[False,False,False,False]])
test_tot= np.zeros(4,dtype='object')
test_tot[0]=test
test_tot[1]=test
test_tot[2]=test
test_tot[3]=test
np.mean(test_tot) # OK
np.median(test_tot) # PROBLEM ?
Заранее благодарю вас за ваши советы
Ответ №1:
Ваш test_tot
массив представляет собой одномерный массив 2D-массивов, а не 3D-массив.
Таким образом, пытаясь найти медиану, вы просите интерпретатор выполнить серию сравнений вида «Этот 2D-массив больше, чем этот другой 2D-массив?». На что интерпретатор отвечает: «Что вы подразумеваете под «большим»? Я не знаю, как сравнить абсолютный размер двух таких объектов »
Если вы используете 3D-массив, вы можете указать, по какой оси вы хотите провести медиану (или ничего не указывать, и в этом случае numpy вычислит медиану сплющенного массива и выдаст вам это):
import numpy as np
import numpy.mask as ma
test = ma.masked_array([[1,2,3,4],[5,6,7,8]], mask = [[False,False,False,False],[False,False,False,False]])
test_tot= np.array([test,test,test,test])
Затем вы можете запросить медиану, указав axis = None, 0, 1 или 2, в зависимости от того, что вы хотите.
Комментарии:
1. Я вижу, спасибо вам за ваш ответ. Итак, поскольку в моем коде я перебираю несколько файлов с помощью цикла for. Лучший способ сделать это — добавить несколько замаскированных массивов на каждой итерации в списке, а затем преобразовать список в массив numpy?
2. Если я могу что-то добавить в ваш код, если у меня есть какой-то флаг, который является True , ввод np.array полностью уничтожит флаг, введенный
ma.masked_array
so , чтобы выполнить вычисления, мы должны объединить весь список, заменивnp.array
на:ma.array(your_list)
. И если мы хотим вычислить медиану:ma.median(ma.array(your_list),axis=0)
. Вдоль оси, в которой вы заинтересованы.