Numpy'de (ve Python genel olarak, sanırım), biri etrafından geçmek ve çeşitli dizilere uygulamak için (..., 0, :) gibi bir dilim indeksini nasıl depolar? Bir dilim indeksini fonksiyonlara ve fonksiyonlardan geçirebilmek güzel olurdu.Numpy: arr [..., 0 ,:] çalışır. Ama dilim komutunda bulunan verileri nasıl saklarım? (..., 0, :)?
cevap
Python, dilim sözdiziminden özel nesneler oluşturur, ancak yalnızca dizinleme için köşeli parantez içinde bulunur. Sen (...,0,:)
(Ellipsis, 0, slice(None, None, None))
olduğunu bu durumda elle bu nesneleri (oluşturabilir veya takvimi biraz yardımcı nesnesi oluşturabilirsiniz:
class ExtendedSliceMaker(object):
def __getitem__(self, idx):
return idx
>>> ExtendedSliceMaker()[...,0,:]
(Ellipsis, 0, slice(None, None, None))
(...,0,:)
eşdeğer olmalıdır ...
>>> myslice = (..., 0, slice(None, None))
>>> myslice
(Ellipsis, 0, slice(None, None, None))
Hayır, o değil 'dilim (0)'; '0' sadece bir endeks. –
@Thomas: Evet, kendim düzeltildi. – JAB
Ben sadece 2 elemanını döndürür bir dilim tanımlamak örneğin üzere myslice = dilim (1,2) (yapmak istiyorum düşünüyorum yani myarray [myslice] == myarray [1: 2])
Python hakkında derli toplu bir şey aslında bunların nasıl incelemek için bir sınıf yapmak olabilir Python, indeksleme işlemlerini işlemek için __getitem__
sihirli yöntemini kullanır, bu yüzden bize nelerin geçtiğini göstermek için sınıfı aşırı yükleyen bir sınıf oluşturacağız, sınıfı başlatalım ve örneğe "endeksleyelim":
Ve sonuçlarımız şöyledir:
(Ellipsis, 0, slice(None, None, None))
Ellipsis
ve slice
yerleşikleri, ve biz onların belgeleri okuyabilir: numpy içinde
help(Ellipsis)
help(slice)
Kullanım s_:
In [1]: np.s_[...,0,:]
Out[1]: (Ellipsis, 0, slice(None, None, None))
Bu, doğrudan temsili önemsemediğinizi veya bunun ne anlama geldiğini varsaydığınız için sorunu çözer, çünkü sadece Numpy'de kullanmak üzere iletirsiniz. Temelde aynı düşünceye sahiptim, ama her şeyin ne olduğunu ve nasıl kazıldığını gösterdim :) –