Странная форма при индексации массива jax

У меня возникла странная проблема при индексировании массива Jax с использованием списка. Если я помещу отладчик в середину своего кода, у меня будет следующее:

Этот массив создается путем преобразования массива numpy.

Однако когда я пробую это в новом экземпляре Python, у меня получается правильное поведение: [Странная форма при индексации массива jax

Что происходит?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это работает так, как ожидалось. JAX следует семантике индексации NumPy, а в случае расширенной индексации с несколькими скалярами и целочисленными массивами, разделенными срезами, индексированные измерения объединяются посредством широковещательной передачи и перемещаются в начало выходного массива. Подробнее о деталях такого индексирования вы можете прочитать в документации NumPy: https://numpy.org/doc/stable/user/basics.indexing.html#combining-advanced-and-basic-indexing. В частности:

Следует различать два случая комбинации индексов:

  • Расширенные индексы разделены срезом, эллипсисом или новой осью. Например x[arr1, :, arr2].
  • Все продвинутые индексы расположены рядом друг с другом. Например, x[..., arr1, arr2, :], но не x[arr1, :, 1], поскольку 1 в этом отношении является расширенным индексом.

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

Код вашей программы подпадает под первый случай, а код вашего отдельного интерпретатора — под второй случай. Вот почему вы видите разные результаты.

Вот краткий пример этой разницы:

>>> import numpy as np
>>> x = np.zeros((3, 4, 5))

>>> x[0, :, [1, 2]].shape  # size-2 dimension moved to front
(2, 4)

>>> x[:, 0, [1, 2]].shape  # size-2 dimension not moved to front
(3, 2)

Спасибо, но я до сих пор не понимаю, почему поведение меняется независимо от того, запускаю ли я его «внутри» своего кода или в новом экземпляре Python.

Chutlhu 16.07.2024 07:10

Это потому, что вы выполняете другой код. coords_[0, :, :, 0, [1, 2]] имеет скалярные индексы и индексы массива, разделенные срезами, поэтому индексированные измерения объединяются посредством широковещательной передачи и перемещаются в начало выходного массива. aj[:, :, [1, 2]] не имеет индексов скаляра и массива, разделенных срезом, поэтому индексированные измерения не перемещаются в начало выходного массива.

jakevdp 16.07.2024 14:15

Я отредактировал свой ответ, процитировав соответствующий отрывок из документации NumPy, на которую я дал ссылку. Надеюсь, это поможет!

jakevdp 16.07.2024 14:39

Другие вопросы по теме