np.средняя ошибка в массиве значений замаскированного массива: значение истинности массива с более чем одним элементом неоднозначно. Используйте.any() или.all()

#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) . Вдоль оси, в которой вы заинтересованы.