2013-02-04 40 views
5

Tôi có một hàm trong lớp Python (2.7) sẽ truy xuất các giá trị của 'ô' xung quanh nó trong mảng 2 chiều. Nếu chỉ mục nằm ngoài phạm vi, tôi sẽ đặt giá trị là Không.Đặt không nếu chỉ mục mảng numpy không tồn tại

Tôi đang cố gắng tìm cách để thực hiện điều này mà không cần viết 8 câu lệnh try/catch hoặc không sử dụng nhiều câu lệnh if x else None như trong mã của tôi bên dưới. Trong khi cả hai đều làm việc, họ dường như không được cấu trúc tốt, và tôi nghĩ rằng phải có một cách đơn giản hơn để làm điều này - tôi có thể bắt gặp suy nghĩ về điều này một cách hoàn toàn sai. Bất kì sự trợ giúp nào đều được đánh giá cao.

# 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

Xem ra chỉ số phủ định xung quanh ...! – wim

+0

Nó đã không xảy ra với tôi, cảm ơn! – Adam

Trả lời

5

Đây là thủ thuật tiêu chuẩn: Tạo bảng của bạn với cạnh đệm có giá trị Không có. Sau đó, bạn có thể truy cập bất kỳ vuông 3x3 bên trong và điền vào các giá trị phù hợp với

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

Ví dụ,

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) 

Lưu ý rằng

  • khi bạn xác định hội đồng quản trị theo cách này , chỉ mục không phải Không đầu tiên hiện là 1, không phải là 0,
  • Tôi nghĩ rằng đó là typic hơn để suy nghĩ về chỉ mục đầu tiên là hàng, và chỉ mục thứ hai làm cột, bởi vì khi bạn print(board) đó là cách các giá trị được định dạng. Vì vậy, có lẽ bạn muốn thay thế board[row-1:row+2, column-1:column+2]. Tất nhiên, bạn có thể xác định hàm print_board của riêng bạn, và sau đó được tự do sử dụng bất kỳ quy ước nào bạn thích.
+0

Một mẹo hay, nhưng chúng có thể gặp khó khăn khi sử dụng 'Không có' trong một mảng có dtype dạng số. Có thể phải sử dụng dtype 'object', không phải là" numpythonic ", hoặc sử dụng' nan' thay vì 'None'. – wim

+0

Đúng, 'nan' có thể là lựa chọn tốt hơn nếu dtype nổi. – unutbu

+0

Cảm ơn bạn! Điều này thực sự hữu ích - tôi cũng không biết cú pháp 'board [:,:] = None'. Dtype của tôi là int, vì vậy tôi sẽ thử nó với 'nan'. – Adam

Các vấn đề liên quan