Python'daki "üç nokta", bir sayıya benzeyen bir şeyi indekslerken ne anlama geliyor?


Yanıtlar:


70

Önerilen yinelenen Python Ellipsis nesnesi ne yapar? soruyu genel bir pythonbağlamda yanıtlar, bir nditerdöngüde kullanımı ek bilgi gerektirir.

https://docs.scipy.org/doc/numpy/reference/arrays.nditer.html#modifying-array-values

Python'da normal atama, mevcut bir değişkeni yerinde değiştirmek yerine yerel veya global değişken sözlüğündeki bir referansı değiştirir. Bu, yalnızca x'e atamanın, değeri dizinin öğesine yerleştirmeyeceği, bunun yerine x'i bir dizi öğesi başvurusundan atadığınız değere bir başvuru olmaya değiştireceği anlamına gelir. Dizinin elemanını gerçekten değiştirmek için, x üç nokta ile dizinlenmelidir.

Bu bölüm kod örneğinizi içerir.

Benim bir deyişle Yani x[...] = ...değiştirir xyerinde; değişkene x = ...olan bağı nditerkoparır ve değiştirmezdi. Bu x[:] = ..., herhangi bir boyuttaki diziler gibidir (0d dahil). Bu bağlamda xsadece bir sayı değil, bir dizi.

Belki de bu nditeryinelemeye en yakın şey nditerşudur:

In [667]: for i, x in np.ndenumerate(a):
     ...:     print(i, x)
     ...:     a[i] = 2 * x
     ...:     
(0, 0) 0
(0, 1) 1
...
(1, 2) 5
In [668]: a
Out[668]: 
array([[ 0,  2,  4],
       [ 6,  8, 10]])

a[i]Doğrudan indekslemem ve değiştirmem gerektiğine dikkat edin . Kullanamazdım x = 2*x. Bu yinelemede xbir skalerdir ve bu nedenle değiştirilebilir değildir

In [669]: for i,x in np.ndenumerate(a):
     ...:     x[...] = 2 * x
  ...
TypeError: 'numpy.int32' object does not support item assignment

Ama nditerdurumda xbir 0d dizisidir ve değiştirilebilir.

In [671]: for x in np.nditer(a, op_flags=['readwrite']):
     ...:     print(x, type(x), x.shape)
     ...:     x[...] = 2 * x
     ...:     
0 <class 'numpy.ndarray'> ()
4 <class 'numpy.ndarray'> ()
...

Ve 0d x[:]olduğu için yerine kullanılamazx[...]

----> 3     x[:] = 2 * x
IndexError: too many indices for array

Daha basit bir dizi yinelemesi de fikir verebilir:

In [675]: for x in a:
     ...:     print(x, x.shape)
     ...:     x[:] = 2 * x
     ...:     
[ 0  8 16] (3,)
[24 32 40] (3,)

bu, satırlarında (1. dim) yinelenir a. xdaha sonra 1d dizidir ve ya modifiye edilebilir x[:]=...ya da x[...]=....

Ben eklerseniz external_loopsonrakinden bayrağı bölümünde , xartık 1d dizidir ve x[:] =çalışmaya devam eder. Ama x[...] =yine de çalışıyor ve daha genel. x[...]diğer tüm nditerörneklerde kullanılmaktadır.

In [677]: for x in np.nditer(a, op_flags=['readwrite'], flags=['external_loop']):
     ...:     print(x, type(x), x.shape)
     ...:     x[...] = 2 * x
[ 0 16 32 48 64 80] <class 'numpy.ndarray'> (6,)

Bu basit satır yinelemesini karşılaştırın (2 boyutlu bir dizide):

In [675]: for x in a:
     ...:     print(x, x.shape)
     ...:     x[:] = 2 * x
     ...:     
[ 0  8 16] (3,)
[24 32 40] (3,)

bu, satırlarında (1. dim) yinelenir a. xdaha sonra 1d dizidir ve ya modifiye edilebilir x[:] = ...ya da x[...] = ....

Bu nditersayfayı sonuna kadar okuyun ve deneyin . Kendi başına, nditero kadar da kullanışlı değil python. Yinelemeyi hızlandırmaz - kodunuzu taşıyana kadar değil cython. kullanan np.ndindexbirkaç derlenmemiş numpyişlevden biridir nditer.


X [1,:, ...] gibi şeylerin de izin verilen sözdizimi olduğuna dikkat edin. Gelecekte referans olması için bırakıldı.
borgr
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.