2013-02-04 29 views
5

2 boyutlu bir numpy dizisinde çevresindeki 'hücrelerin' değerlerini alması gereken bir Python (2.7) sınıfı içinde işlevim var. İndeks aralık dışı ise, değerin Hiçbiri olarak ayarlanması gerekirdi.Sayısal dizi dizini mevcut değilse hiçbiri ayarlama

Bunu, 8 try/catch ifadesi yazmadan veya birden fazla x kullanmadan yazmanın bir yolunu bulmaya çalışıyorum. Her ikisi de işe yarayacak olsa da, çok iyi yapılandırılmış görünmüyorlar ve bunu yapmanın daha basit bir yolu olmalı diye düşünüyorum - Muhtemelen bu konuda tamamen yanlış bir şekilde düşündüm. Herhangi bir yardım çok takdir edilecektir.

# This will return a dictionary with the values of the surrounding points 
def get_next_values(self, column, row): 
    if not (column < self.COLUMNS and row < self.ROWS): 
     print "Invalid row/column." 
     return False 

    nextHorizIsIndex = True if column < self.COLUMNS - 2 else False 
    nextVertIsIndex = True if row < self.ROWS - 2 else False 

    n = self.board[column, row-1] if column > 0 else None 
    ne = self.board[column+1, row-1] if nextHorizIsIndex else None 
    e = self.board[column+1, row] if nextHorizIsIndex else None 
    se = self.board[column+1, row+1] if nextHorizIsIndex and nextVertIsIndex else None 
    s = self.board[column, row+1] if nextVertIsIndex else None 
    sw = self.board[column-1, row+1] if nextVertIsIndex else None 
    w = self.board[column-1, row] if row > 0 else None 
    nw = self.board[column-1, row-1] if 0 not in [row, column] else None 

    # debug 
    print n, ne, e, se, s, sw, w, nw 
+1

Negatif indeks sargı etrafına dikkat edin ...! – wim

+0

Bana hiç bulaşmamıştı, teşekkürler! – Adam

cevap

5

İşte standart bir numaradır: Kartınızı, hiçbiri değeri ile doldurulmuş bir kenarla oluşturun. Sonra

  • bu şekilde kurulu tanımlarken o

    import numpy as np 
    
    board = np.empty((10,10), dtype = 'object') 
    board[:,:] = None 
    board[1:9, 1:9] = np.arange(64).reshape(8,8) 
    print(board) 
    # [[None None None None None None None None None None] 
    # [None 0 1 2 3 4 5 6 7 None] 
    # [None 8 9 10 11 12 13 14 15 None] 
    # [None 16 17 18 19 20 21 22 23 None] 
    # [None 24 25 26 27 28 29 30 31 None] 
    # [None 32 33 34 35 36 37 38 39 None] 
    # [None 40 41 42 43 44 45 46 47 None] 
    # [None 48 49 50 51 52 53 54 55 None] 
    # [None 56 57 58 59 60 61 62 63 None] 
    # [None None None None None None None None None None]] 
    
    column = 1 
    row = 1 
    nw, n, ne, w, _, e, sw, s, se = (board[column-1:column+2, row-1:row+2]).ravel() 
    print(nw, n, ne, w, _, e, sw, s, se) 
    # (None, None, None, None, 0, 1, None, 8, 9) 
    

    Not

    nw, n, ne, w, _, e, sw, s, se = (self.board[column-1:column+2, row-1:row+2]).ravel() 
    
    Örneğin

    ile uygun değerlerde herhangi bir iç 3x3 kare erişebilir ve doldurabilir İlk non-None indeksi 1 değil, 0'dır.

  • Daha tipik olduğunu düşünüyorum İlk satırı ve sütun olarak ikinci dizini düşünmek için, çünkü print(board) , değerlerin biçimlendirilme şeklidir. Yani belki de board[row-1:row+2, column-1:column+2] olmasını istiyorsunuz. Elbette, kendi print_board işlevinizi tanımlayabilir ve daha sonra istediğiniz herhangi bir sözleşmeyi kullanabilirsiniz.
+0

İyi bir hile, ancak sayısal bir türü olan bir dizide 'Yok 'kullanmakta sorun yaşayabilirler. Çok "numpythonic" olmayan veya "Yok" yerine "nan" olan dtype 'object' kullanmak zorunda kalabilir. – wim

+0

Doğru, dtype float ise, nan 'daha iyi bir seçim olabilir. – unutbu

+0

Teşekkürler! Bu gerçekten yararlı - Ben 'kurulu [:,:] = Hiçbiri' sözdizimi de farkında değildim. Benim dtype int, bu yüzden 'nan' ile doldurulmuş bir deneyin vereceğim. – Adam

İlgili konular