Numpy.where'i anlama
Aynı dizinin bazı belirli öğelerinden daha büyük olan numpy dizi öğesinin ilk dizinini almak istiyorum. Aşağıdakileri denedim:
>>> Q5=[[1,2,3],[4,5,6]]
>>> Q5 = np.array(Q5)
>>> Q5[0][Q5>Q5[0,0]]
array([2, 3])
>>> np.where(Q5[0]>Q5[0,0])
(array([1, 2], dtype=int32),)
>>> np.where(Q5[0]>Q5[0,0])[0][0]
1
S1. Yukarıdaki bir elemanın ilk indeksini şundan Q5[0]büyük olarak elde etmenin doğru yolu mudur Q5[0,0]?
np.where(Q5[0]>Q5[0,0])Tuple'ı döndürmekle daha çok ilgileniyorum (array([1, 2], dtype=int32),)ve bu nedenle [0][0]sonunda indekslememi ikiye katlamamı gerektiriyor np.where(Q5[0]>Q5[0,0])[0][0].
S2. Neden bu dönüş demeti, ancak aşağıda uygun numpy dizisi döndürüyor?
>>> np.where(Q5[0]>Q5[0,0],Q5[0],-1)
array([-1, 2, 3])
Doğrudan indeksleyebilmem için:
>>> np.where(Q5[0]>Q5[0,0],Q5[0],-1)[1]
2
Yanıtlar
In [58]: A = np.arange(1,10).reshape(3,3)
In [59]: A.shape
Out[59]: (3, 3)
In [60]: A
Out[60]:
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
np.wheresadece şartı ile gerçekten np.nonzero.
Bir boole dizisi oluşturun:
In [63]: A==6
Out[63]:
array([[False, False, False],
[False, False, True],
[False, False, False]])
Bunun doğru olduğu yeri bulun:
In [64]: np.nonzero(A==6)
Out[64]: (array([1]), array([2]))
Sonuç, koşulun boyutu başına bir öğe olan bir demettir. Her öğe bir dizinleme dizisidir ve birlikte True (s) öğelerinin konumunu tanımlarlar
Birkaç True içeren başka bir test
In [65]: (A%3)==1
Out[65]:
array([[ True, False, False],
[ True, False, False],
[ True, False, False]])
In [66]: np.nonzero((A%3)==1)
Out[66]: (array([0, 1, 2]), array([0, 0, 0]))
Orijinal diziyi indekslemek için demeti kullanma:
In [67]: A[np.nonzero((A%3)==1)]
Out[67]: array([1, 4, 7])
3 argüman kullanarak wheredeğerlerin karışımı ile yeni bir dizi oluşturmak için AveA+10
In [68]: np.where((A%3)==1,A+10, A)
Out[68]:
array([[11, 2, 3],
[14, 5, 6],
[17, 8, 9]])
Koşul birden fazla True'ya sahipse nonzero, mutlaka hepsini bulduğu için "ilk" i bulmak için test aracı değildir.
Sıfır olmayan tuple, bir transpose. Aslında bu diziden "ilk" i elde etmek daha kolay olabilir:
In [73]: np.argwhere((A%3)==1)
Out[73]:
array([[0, 0],
[1, 0],
[2, 0]])
1d'lik bir diziye bakıyorsunuz, bir A satırı:
In [77]: A[0]>A[0,0]
Out[77]: array([False, True, True])
In [78]: np.nonzero(A[0]>A[0,0])
Out[78]: (array([1, 2]),) # 1 element tuple
In [79]: np.argwhere(A[0]>A[0,0])
Out[79]:
array([[1],
[2]])
In [81]: np.where(A[0]>A[0,0], 100, 0) # 3 argument where
Out[81]: array([ 0, 100, 100])
Dolayısıyla, ister 1d dizisi ister 2d (veya 3 veya 4) arıyor olun, boyut başına bir dizi öğesi olan nonzerobir demet döndürür . Bu şekilde, her zaman benzer boyutlu bir diziyi indekslemek için kullanılabilir. 1d tuple gereksiz görünebilir, ancak diğer boyutsal sonuçlarla tutarlıdır.
Bunun gibi işlemleri anlamaya çalışırken, belgeleri dikkatlice okuyun ve ayrı adımlara bakın. Burada koşullu matrise, nonzerosonuca ve çeşitli kullanımlarına bakıyorum .
numpy.where (), if ile bir for döngüsü gibidir.
numpy.where(condition, values, new_value)
durum - tıpkı koşullar gibi.
değerler - değerleri yinelemek için
new_value - eğer koşul bir için de geçerlidir değeri , onun için değişecek new_value
1 boyutlu bir dizi için yazmak istersek, şöyle görünmelidir:
[xv if c else yv
for c, xv, yv in zip(condition, x, y)]
Misal:
>>> a = np.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np.where(a < 5, a, 10*a)
array([ 0, 1, 2, 3, 4, 50, 60, 70, 80, 90])
Önce 0'dan 9'a (0, 1, 2 ... 7, 8, 9) sayılardan oluşan bir dizi oluşturuyoruz
ve ardından dizideki 5'ten büyük olan tüm değerleri kontrol edip değerlerini 10 ile çarpıyoruz.
Şimdi dizide 5'ten küçük olan tüm değerler aynı kaldı ve daha büyük olan tüm değerler 10 ile çarpıldı
argmaxBir boole dizisi ile kullanmak size ilk True indeksini verecektir.
In [54]: q
Out[54]:
array([[1, 2, 3],
[4, 5, 6]])
In [55]: q > q[0,0]
Out[55]:
array([[False, True, True],
[ True, True, True]], dtype=bool)
argmax bir eksen / boyut argümanı alabilir.
In [56]: np.argmax(q > q[0,0], 0)
Out[56]: array([1, 0, 0], dtype=int64)
Bu, ilk Doğru'nun sütun sıfır için dizin bir ve birinci ve ikinci sütunlar için dizin sıfır olduğunu söylüyor.
In [57]: np.argmax(q > q[0,0], 1)
Out[57]: array([1, 0], dtype=int64)
Bu, ilk Doğru'nun satır sıfır için dizin bir ve satır bir için dizin sıfır olduğunu söylüyor.
S1. Yukarıdaki Q5 [0] 'daki bir elemanın ilk indeksini Q5 [0,0]' dan büyük elde etmenin doğru yolu mudur?
Hayır , argüman için kullanırım argmaxve sonra bu sonuçtan ilk öğeyi seçerim.1axis
S2. Neden bu dönüş demeti
-1Yanlış değerler için geri dönmesini ve Q5[0]Doğru değerler için öğe döndürmesini söylediniz .
Q2 ... ama aşağıda uygun numpy dizisi döndürüyor?
Şanslıydın ve doğru dizini seçtin.