Numpy: np.copy (маскированный массив) имеет неожиданное поведение

Созданный на 26 июн. 2013  ·  11Комментарии  ·  Источник: numpy/numpy

.... где "неожиданный" означает, что _I_ этого не ожидал. Это может быть просто исправление документации, или, может быть, меня будут ругать за то, что я не понимаю, как работает np.ma , но я не думаю, что такое поведение уместно:

In [100]: x = np.ma.ones(5)

In [101]: x.mask = [False,False,True,False,False]

In [102]: np.copy(x)
Out[102]: array([ 1.,  1.,  1.,  1.,  1.])

In [103]: np.ma.copy(x)
Out[103]:
masked_array(data = [1.0 1.0 -- 1.0 1.0],
             mask = [False False  True False False],
       fill_value = 1e+20)

In [104]: np.__version__
Out[104]: '1.8.0.dev-074a40c'

Я бы, по крайней мере, ожидал предупреждения, но предпочел бы видеть в порядке предпочтения:

  • np.copy(x) возвращает замаскированный массив (поскольку x - замаскированный массив)
  • np.copy(x) предупреждает, что он демаскирует массив, а затем возвращает тот же массив, что и выше
  • np.copy(x) вызывает исключение
  • np.copy(x) возвращает [1,1,nan,1,1] (вероятно, это не идеально)
00 - Bug numpy.lib

Все 11 Комментарий

Все еще открыт в 1.9-devel

Однако не знаю, как это исправить без специальных массивов с маскировкой корпуса.

Может ли изменение логики np.copy для включения subok=True в вызов массива решить эту проблему?
Из:

return array(a, order=order, copy=True)

Кому:

return array(a, order=order, subok=True, copy=True)

Если да, то должен ли subok быть параметром для np.copy и какое значение должно быть по умолчанию, True или False? True вернет первый предпочтительный результат, False сохранит текущее поведение, но разрешит ожидаемое поведение, но добавит аргумент.

Я не сторонник добавления параметра subok к np.copy когда у нас уже есть два вполне жизнеспособных решения:

  • используйте метод .copy()
  • используйте np.array(a, subok=True) (по умолчанию копирует)

Я бы на самом деле утверждал обратное, поскольку я думаю, что в большинстве случаев «копия» создает впечатление, что кто-то получит обратно что-то, что на самом деле является копией и, следовательно, того же типа. Я также считаю это небольшим, но полезным вкладом в то, чтобы сделать весь numpy более последовательным, способным работать с подклассами (так же, как я делал ранее с np.broadcast_arrays , где не было хорошей замены). Однако, учитывая необходимость сохранения обратной совместимости, я думаю, что мы застряли со значением по умолчанию subok=False .

В любом случае, @jjhelmus , почему бы не сделать быстрый пиар и не узнать, что думают другие?

@shoyer : np.copy, вероятно, должен войти в ваш список функций, которым требуется
какая-то поддержка массива уток - для массива уток я думаю np.copy
и np.array, вероятно, должны делать разные вещи. Может, стоит просто позвонить
arr.copy?

15 октября 2015 г., 7:00, Мартен ван Керквейк <
[email protected]> написал:

На самом деле я бы поспорил с обратным, поскольку я считаю, что большинство "копий" дает
впечатление, что кто-то получит обратно что-то, на самом деле копию,
и, следовательно, того же типа. Я также рассматриваю это как небольшой, но полезный вклад
чтобы все numpy более последовательно могли работать с подклассами
(так же, как я делал ранее с np.broadcast_arrays, где нет хорошей замены
был в наличии). Однако, учитывая необходимость сохранения обратной совместимости, я
Думаю, мы застряли со значением по умолчанию subok = False.

В любом случае, @jjhelmus https://github.com/jjhelmus , почему бы не сделать быстрый пиар
и посмотреть, что думают другие?

-
Ответьте на это письмо напрямую или просмотрите его на GitHub
https://github.com/numpy/numpy/issues/3474#issuecomment -148395201.

Натаниэль Дж. Смит - http://vorpus.org

Да, я бы получил +1, если бы np.copy попробовал вызвать метод копирования для утиных массивов.

По-прежнему нет причин не поддерживать subok . И, конечно, можно просто вызвать __copy__ если он существует.

Создан PR # 6509, который добавляет к функции параметр False . Я предполагаю, что это откроет дискуссию по этой теме. Не уверен, что это обычно происходит в PR, проблеме или списке рассылки.

Обсуждение API должно быть в списке рассылки.
18 октября 2015 г., 19:37, "Джонатан Дж. Хельмус" [email protected]
написал:

Создан PR № 6509 https://github.com/numpy/numpy/pull/6509, который добавляет
Параметр _subok_ функции со значением по умолчанию _False_. я
предположение, это откроет дискуссию по теме. Не уверен, что это
обычно размещается в PR, проблеме или списке рассылки.

-
Ответьте на это письмо напрямую или просмотрите его на GitHub
https://github.com/numpy/numpy/issues/3474#issuecomment -149080511.

Я отправлю электронное письмо в список рассылки по этой теме завтра.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги