Numpy: arr [..., 0 ,:] работает. Но как мне сохранить данные, содержащиеся в команде slice (..., 0, :)? - PullRequest
5 голосов
/ 23 июля 2011

В Numpy (и, я полагаю, в Python в целом), как хранить индекс слайса, такой как (..., 0, :), чтобы передать его и применить к различным массивам? Было бы неплохо, скажем, иметь возможность передавать индекс слайса в функции и из них.

Ответы [ 5 ]

9 голосов
/ 23 июля 2011

Python создает специальные объекты из синтаксиса слайса, но только внутри квадратных скобок для индексации.Вы можете создать эти объекты вручную (в этом случае (...,0,:) равно (Ellipsis, 0, slice(None, None, None)), или вы можете создать маленький вспомогательный объект:

class ExtendedSliceMaker(object):
    def __getitem__(self, idx):
        return idx

>>> ExtendedSliceMaker()[...,0,:]
(Ellipsis, 0, slice(None, None, None))
5 голосов
/ 25 июля 2011

Используйте s_ в NumPy:

In [1]: np.s_[...,0,:]
Out[1]: (Ellipsis, 0, slice(None, None, None))
3 голосов
/ 23 июля 2011

Отличительной особенностью Python является то, что вы можете создать класс для проверки представления этих вещей.Python использует магический метод __getitem__ для обработки операций индексирования, поэтому мы создадим класс, который перегружает его, чтобы показать нам, что было передано, создать экземпляр класса и «индексировать» в экземпляре:

class foo:
  def __getitem__(self, index): print index

foo()[...,0,:]

И наш результат:

(Ellipsis, 0, slice(None, None, None))

Ellipsis и slice являются встроенными, и мы можем прочитать их документацию:

help(Ellipsis)
help(slice)
3 голосов
/ 23 июля 2011

Эквивалент (...,0,:) должен быть ...

>>> myslice = (..., 0, slice(None, None))
>>> myslice
(Ellipsis, 0, slice(None, None, None))
0 голосов
/ 23 июля 2011

Я думаю, вы хотите просто сделать myslice = slice (1,2), например, чтобы определить срез, который будет возвращать 2-й элемент (то есть myarray [myslice] == myarray [1: 2])

...