Задайте значения в массиве numpy в NaN по индексу

Я хочу установить определенные значения в массиве numpy в NaN (чтобы исключить их из среднеквадратического вычисления).

Я пытался

 import numpy x = numpy.array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 0, 0, 0, 0, 0, 0, 0, 1, 0]]) cutoff = [5, 7] for i in range(len(x)): x[i][0:cutoff[i]:1] = numpy.nan 

Глядя на x , я вижу только -9223372036854775808 где я ожидаю NaN .

Я подумал об альтернативе:

 for i in range(len(x)): for k in range(cutoff[i]): x[i][k] = numpy.nan 

Ничего не произошло. Что я делаю не так?

  • Случайный разрыв Python datetime
  • Производительность Pandas DataFrame
  • Как подкласс scipy.stats.norm?
  • Запуск mnist_softmax.py в Tensorflow, установленном с помощью Docker
  • FileStorage для OpenCV Python API
  • Как синхронизировать python dict с многопроцессорной обработкой
  • Mac - Python - ошибка импорта: «Нет модуля с именем сайта»
  • Проверка диапазона Tkinter Spinbox
  • 2 Solutions collect form web for “Задайте значения в массиве numpy в NaN по индексу”

    Векторизованный подход для установки соответствующих элементов в виде NaN

    Решение @ unutbu должно избавиться от ошибки значения, которую вы получали. Если вы ищете для vectorize производительности, вы можете использовать boolean indexing например:

     import numpy as np # Create mask of positions in x (with float datatype) where NaNs are to be put mask = np.asarray(cutoff)[:,None] > np.arange(x.shape[1]) # Put NaNs into masked region of x for the desired ouput x[mask] = np.nan 

    Пример прогона –

     In [92]: x = np.random.randint(0,9,(4,7)).astype(float) In [93]: x Out[93]: array([[ 2., 1., 5., 2., 5., 2., 1.], [ 2., 5., 7., 1., 5., 4., 8.], [ 1., 1., 7., 4., 8., 3., 1.], [ 5., 8., 7., 5., 0., 2., 1.]]) In [94]: cutoff = [5,3,0,6] In [95]: x[np.asarray(cutoff)[:,None] > np.arange(x.shape[1])] = np.nan In [96]: x Out[96]: array([[ nan, nan, nan, nan, nan, 2., 1.], [ nan, nan, nan, 1., 5., 4., 8.], [ 1., 1., 7., 4., 8., 3., 1.], [ nan, nan, nan, nan, nan, nan, 1.]]) 

    Векторизованный подход для непосредственного вычисления среднеквадратического значения соответствующих элементов

    Если вы пытались получить средние значения в масках, вы можете изменить ранее предложенный векторизованный подход, чтобы избежать взаимодействия с NaNs целом и, что более важно, сохранить x с целыми значениями. Вот модифицированный подход –

     # Get array version of cutoff cutoff_arr = np.asarray(cutoff) # Mask of positions in x which are to be considered for row-wise mean calculations mask1 = cutoff_arr[:,None] <= np.arange(x.shape[1]) # Mask x, calculate the corresponding sum and thus mean values for each row masked_mean_vals = (mask1*x).sum(1)/(x.shape[1] - cutoff_arr) 

    Вот пример запуска для такого решения –

     In [61]: x = np.random.randint(0,9,(4,7)) In [62]: x Out[62]: array([[5, 0, 1, 2, 4, 2, 0], [3, 2, 0, 7, 5, 0, 2], [7, 2, 2, 3, 3, 2, 3], [4, 1, 2, 1, 4, 6, 8]]) In [63]: cutoff = [5,3,0,6] In [64]: cutoff_arr = np.asarray(cutoff) In [65]: mask1 = cutoff_arr[:,None] <= np.arange(x.shape[1]) In [66]: mask1 Out[66]: array([[False, False, False, False, False, True, True], [False, False, False, True, True, True, True], [ True, True, True, True, True, True, True], [False, False, False, False, False, False, True]], dtype=bool) In [67]: masked_mean_vals = (mask1*x).sum(1)/(x.shape[1] - cutoff_arr) In [68]: masked_mean_vals Out[68]: array([ 1. , 3.5 , 3.14285714, 8. ]) 

    nan – значение с плавающей запятой. Когда x – массив с целым dtype, ему не может быть присвоено значение nan. Когда nan присваивается массиву целочисленного dtype, значение автоматически преобразуется в int:

     In [85]: np.array(np.nan).astype(int).item() Out[85]: -9223372036854775808 

    Поэтому, чтобы исправить ваш код, сделайте x массив float dtype:

     x = numpy.array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 0, 0, 0, 0, 0, 0, 0, 1, 0]], dtype=float) 

     import numpy x = numpy.array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 0, 0, 0, 0, 0, 0, 0, 1, 0]], dtype=float) cutoff = [5, 7] for i in range(len(x)): x[i][0:cutoff[i]:1] = numpy.nan print(x) с import numpy x = numpy.array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 0, 0, 0, 0, 0, 0, 0, 1, 0]], dtype=float) cutoff = [5, 7] for i in range(len(x)): x[i][0:cutoff[i]:1] = numpy.nan print(x) 

    доходность

     array([[ nan, nan, nan, nan, nan, 5., 6., 7., 8., 9.], [ nan, nan, nan, nan, nan, nan, nan, 0., 1., 0.]]) 
    Python - лучший язык программирования в мире.