x[...]
Aşağıdakinin anlamı nedir ?
a = np.arange(6).reshape(2,3)
for x in np.nditer(a, op_flags=['readwrite']):
x[...] = 2 * x
x[...]
Aşağıdakinin anlamı nedir ?
a = np.arange(6).reshape(2,3)
for x in np.nditer(a, op_flags=['readwrite']):
x[...] = 2 * x
Yanıtlar:
Önerilen yinelenen Python Ellipsis nesnesi ne yapar? soruyu genel bir python
bağlamda yanıtlar, bir nditer
dö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 x
yerinde; değişkene x = ...
olan bağı nditer
koparır ve değiştirmezdi. Bu x[:] = ...
, herhangi bir boyuttaki diziler gibidir (0d dahil). Bu bağlamda x
sadece bir sayı değil, bir dizi.
Belki de bu nditer
yinelemeye 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 x
bir 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 nditer
durumda x
bir 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
. x
daha sonra 1d dizidir ve ya modifiye edilebilir x[:]=...
ya da x[...]=...
.
Ben eklerseniz external_loop
sonrakinden bayrağı bölümünde , x
artı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
. x
daha sonra 1d dizidir ve ya modifiye edilebilir x[:] = ...
ya da x[...] = ...
.
Bu nditer
sayfayı sonuna kadar okuyun ve deneyin . Kendi başına, nditer
o kadar da kullanışlı değil python
. Yinelemeyi hızlandırmaz - kodunuzu taşıyana kadar değil cython
. kullanan np.ndindex
birkaç derlenmemiş numpy
işlevden biridir nditer
.