Bu Python'un Gizli özelliklerinde ortaya çıktı , ancak özelliğin nasıl çalıştığını açıklayan iyi belgeler veya örnekler göremiyorum.
Bu Python'un Gizli özelliklerinde ortaya çıktı , ancak özelliğin nasıl çalıştığını açıklayan iyi belgeler veya örnekler göremiyorum.
Yanıtlar:
Ellipsis
veya ...
gizli bir özellik değil, yalnızca sabittir. Diyelim ki javascript ES6, dil sözdiziminin bir parçası. Hiçbir yerleşik sınıf veya Python dil yapısı bunu kullanmaz.
Yani sözdizimi tamamen size veya başkasına, onu anlamak için kod yazmış olmanıza bağlıdır.
Numpy bunu dokümanlarda belirtildiği gibi kullanır . Burada bazı örnekler .
Kendi sınıfınızda şu şekilde kullanırsınız:
>>> class TestEllipsis(object):
... def __getitem__(self, item):
... if item is Ellipsis:
... return "Returning all items"
... else:
... return "return %r items" % item
...
>>> x = TestEllipsis()
>>> print x[2]
return 2 items
>>> print x[...]
Returning all items
Tabii ki, python belgeleri ve dil referansı var . Ama bunlar pek yardımcı değil.
Üç nokta yüksek boyutlu veri yapılarını dilimlemek için numpy'de kullanılır.
Demek için tasarlanmış , bu noktada birçok tam dilimler (olarak eklemek :
) tüm boyutları çok boyutlu dilim uzatmak için .
Örnek :
>>> from numpy import arange
>>> a = arange(16).reshape(2,2,2,2)
Şimdi, 2x2x2x2 boyutunda 4 boyutlu bir matrisiniz var. 4. boyuttaki tüm ilk öğeleri seçmek için üç nokta gösterimini kullanabilirsiniz
>>> a[..., 0].flatten()
array([ 0, 2, 4, 6, 8, 10, 12, 14])
eşdeğer
>>> a[:,:,:,0].flatten()
array([ 0, 2, 4, 6, 8, 10, 12, 14])
Kendi uygulamalarınızda, yukarıda belirtilen sözleşmeyi görmezden gelebilir ve uygun gördüğünüz şekilde kullanabilirsiniz.
a[:,:,:,0]
bir kopya a[...,0]
döndürecek ve kopya değil "görünüm" döndürecek değil mi? id()
Hem sürümleri hem de 3-dim dizi için çalışan denedim : a[:,:,:, 0], a[:,:,:, 1], a[:,:,:, 2]
tüm farklı kimlikleri varken: a[..., 0], a[..., 1], a[..., 2]
tüm aynı kimlikleri var.
id()
her ikisi için de aynı değeri döndürür. Ayrıca ile kontrol etmek __array_interface__['data']
aynı bellek adresini gösterir.
a[indexes, ...]
bir 1-dimenstional dizi bile iken!
Bu, dilimleri ile ilgisi olmayan Elipsis için başka bir kullanımdır: Sıklıkla kuyruklarla iplik içi iletişimde, "Bitti" sinyalini veren bir işaret olarak kullanıyorum; orada, bu bir nesne, bu bir singleton ve adı "yok" anlamına geliyor ve aşırı kullanılmış Yok (normal veri akışının bir parçası olarak bir sıraya konabilir). YMMV.
Diğer cevaplarda belirtildiği gibi, dilim oluşturmak için kullanılabilir. Çok sayıda tam dilim gösterimi ( :
) yazmak istemediğinizde veya değiştirilen dizinin boyutunun ne olduğundan emin değilseniz kullanışlıdır.
Vurgulamak için önemli olduğunu düşündüğüm ve diğer cevaplarda eksik olan şey, doldurulacak daha fazla boyut olmasa bile kullanılabileceğidir.
Misal:
>>> from numpy import arange
>>> a = arange(4).reshape(2,2)
Bu hataya neden olur:
>>> a[:,0,:]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: too many indices for array
Bu çalışacak:
a[...,0,:]
array([0, 1])