Pertanyaan Set none jika indeks array numpy tidak ada


Saya memiliki fungsi dalam kelas Python (2.7) yang harus mengambil nilai-nilai 'sel' di sekitarnya dalam array 2 dimensi numpy. Jika indeks berada di luar jangkauan, saya akan nilainya harus ditetapkan sebagai Tidak Ada.

Saya berjuang untuk menemukan cara untuk melakukan ini tanpa menulis 8 pernyataan try / catch, atau tanpa menggunakan multiple if x else None statements seperti dalam kode saya di bawah ini. Sementara mereka berdua bekerja, mereka tidak tampak terstruktur dengan baik, dan saya berpikir pasti ada cara yang lebih sederhana untuk melakukan ini - saya mungkin tertangkap memikirkan hal ini sepenuhnya dengan cara yang salah. Bantuan apa pun akan sangat dihargai.

# 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

5
2018-02-04 02:15


asal


Jawaban:


Berikut ini adalah trik standar: Buat papan Anda dengan tepi yang empuk dengan nilai Tidak ada. Kemudian Anda dapat mengakses kotak 3x3 dalam dan mengisi nilai yang sesuai dengan

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

Sebagai contoh,

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)

Perhatikan itu

  • ketika Anda mendefinisikan papan dengan cara ini, indeks non-None pertama sekarang 1, bukan 0.
  • Saya pikir itu lebih khas untuk memikirkan indeks pertama sebagai baris, dan indeks kedua sebagai kolom, karena ketika Anda print(board) itulah cara nilai diformat. Jadi mungkin kamu mau board[row-1:row+2, column-1:column+2] sebagai gantinya. Tentu saja, Anda bisa menentukan sendiri print_board berfungsi, dan kemudian bebas menggunakan konvensi apa pun yang Anda suka.

5
2018-02-04 02:26