带孔的矩形阵列

时间:2020-04-22 13:23:57

标签: python

我正在尝试创建一种在某些单元格(但不是全部)中都带有数字的矩形网格,这种方式很容易选择给定的行或列。

到目前为止,我所做的是创建网格中数字位置的列表以及网格中包含的数字列表,以便我可以使用{{选择位置(i,j)处的数字1}},但这不是很方便,特别是在例如需要在给定列中找到最小值的情况下。

是否有一种创建网格的方法,例如,我可以选择带有numbers[positions.index([i,j])的元素和带有grid[i][j]或类似元素的列?编程语言是Python。

3 个答案:

答案 0 :(得分:0)

您可以为此使用numpy。它使您可以创建一个数组,该数组可以使用let html = data.categories.map(c => `<ul><li class="cat" catid=${c.id}><a href="#">${c.name}</a></li></ul>`); 索引单个值或使用array[i,j]索引整列。

我不完全确定孔的意思,但是numpy将要求您在数组的每个位置都有一个值。我相信最好的办法是将其设置为预设的“空”值。

答案 1 :(得分:0)

将网格存储为2D数组(矩阵),并使用list comprehensions

first_column = [row[0] for row in grid]
second_column = [row[1] for row in grid]

答案 2 :(得分:0)

如果您将有很大一部分未使用的“单元格”,则可以尝试使用以坐标为键的字典作为元组中的键。

matrix = dict()

matrix[1,3] = 13
matrix[1,5] = 15
matrix[2,3] = 23
matrix[2,7] = 27
matrix[3,7] = 37

valuesInRow2 = [v for (r,c),v in matrix.items() if r==2]
# [23,27]

通过创建dict的子类来管理索引和重写运算符,您可以使其完全按照您想要的方式运行:

class Sparse(dict):

    def __init__(self,rows=0,cols=0):
        super().__init__()
        self.rows = rows
        self.cols = cols

    def __indexToRanges(self,rowIndex,colIndex):
        scalar = isinstance(rowIndex,int) and isinstance(colIndex,int)
        if isinstance(rowIndex,slice):
            rowRange = range(*rowIndex.indices(self.rows))
        else:
            rowRange = range(rowIndex,rowIndex+1)
        if isinstance(colIndex,slice):
            colRange = range(*colIndex.indices(self.cols))
        else:
            colRange = range(colIndex,colIndex+1)
        return rowRange,colRange,scalar

    def __getitem__(self,indexes):
        row,col = indexes
        rowRange,colRange,scalar = self.__indexToRanges(row,col)
        if scalar: return super()._getitem((row,col))
        return [v for (r,c),v in self.items() if r in rowRange and c in colRange]

    def __setitem__(self,index,value):
        row,col=index
        rowRange,colRange,scalar = self.__indexToRanges(row,col)
        if scalar:
            self.rows = max(self.rows,row+1)
            self.cols = max(self.cols,col+1)
            return super().__setitem__((row,col),value)

用法:

matrix = Sparse()

matrix[1,3] = 13
matrix[1,5] = 15
matrix[2,3] = 23
matrix[2,7] = 27
matrix[3,7] = 37

print("sum of column 3:",     sum(matrix[:,3]) )  # 36
print("sum of row 2:",        sum(matrix[2,:]) )  # 50
print("top left 4x4 values:", matrix[:4,:4]    )  # [13, 23]
相关问题