python中的矩阵乘法给出错误,我该如何克服?

时间:2019-03-20 11:09:04

标签: python multidimensional-array

我正在尝试打印以下图案:

 var selectedArr = [Int]()

 func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

           let cell = collectionView.cellForRow(at:indexPath) as! EventItemCollectionViewCell

            if !selectedArr.contains(indexPath.item) {
                cell.imageCheck.image = UIImage(named: "success-1")
                self.selectedArr.append(indexPath.row)
            } else {
                cell.imageCheck.image = UIImage(named: "success-2")
                self.selectedArr.remove(where:{ $0 == indexPath.item })
            }
        }
    }

我的python代码是:

3 3 3 3 3
3 2 2 2 3
3 2 1 2 3
3 2 2 2 3
3 3 3 3 3

但是我遇到以下错误:

def pattern(n):
    d = n + (n - 1)
    l = [[0 for row in range(d)] for col in range(d)]
    for a in range(0, n):
        for i in range(a, d):
            for j in range(a, d):
                l[a][i][j].append(n)
        d -= 1
        n -= 1


print(pattern(3))

有人可以指导我如何克服这个问题吗?

谢谢。

2 个答案:

答案 0 :(得分:4)

由于很难理解您的代码应该如何执行(抱歉!),因此,这是一种非常Python化的方式来生成像这样的矩阵作为生成器函数。

def pattern(n):
    size = n * 2 - 1
    n_1 = n - 1
    for y in range(size):
        yield [max(abs(x - n_1), abs(y - n_1)) + 1 for x in range(size)]

这个想法是,我们查看从n - 1生成的像元的“距离”,该距离必须是网格的中心点(n * 2 - 1个项目宽而高)

由于它是一个生成器函数,因此您可以通过调用以下命令获取列表列表: list(pattern(size))

这是一个示例程序–

for size in range(1, 6):
    print(size)
    for row in pattern(size):
        print(row)

–及其输出:

1
[1]
2
[2, 2, 2]
[2, 1, 2]
[2, 2, 2]
3
[3, 3, 3, 3, 3]
[3, 2, 2, 2, 3]
[3, 2, 1, 2, 3]
[3, 2, 2, 2, 3]
[3, 3, 3, 3, 3]
4
[4, 4, 4, 4, 4, 4, 4]
[4, 3, 3, 3, 3, 3, 4]
[4, 3, 2, 2, 2, 3, 4]
[4, 3, 2, 1, 2, 3, 4]
[4, 3, 2, 2, 2, 3, 4]
[4, 3, 3, 3, 3, 3, 4]
[4, 4, 4, 4, 4, 4, 4]
5
[5, 5, 5, 5, 5, 5, 5, 5, 5]
[5, 4, 4, 4, 4, 4, 4, 4, 5]
[5, 4, 3, 3, 3, 3, 3, 4, 5]
[5, 4, 3, 2, 2, 2, 3, 4, 5]
[5, 4, 3, 2, 1, 2, 3, 4, 5]
[5, 4, 3, 2, 2, 2, 3, 4, 5]
[5, 4, 3, 3, 3, 3, 3, 4, 5]
[5, 4, 4, 4, 4, 4, 4, 4, 5]
[5, 5, 5, 5, 5, 5, 5, 5, 5]

编辑:根据注释的要求,这是一个简化版本,它不是生成器函数,并且不使用列表推导:

def pattern_simple(n):
    size = n * 2 - 1
    n_1 = n - 1
    rows = []
    for y in range(size):
        row = []
        for x in range(size):
            row.append(max(abs(x - n_1), abs(y - n_1)) + 1)
        rows.append(row)
    return rows

答案 1 :(得分:1)

即使答案有点晚,也可以从您自己的代码开始...

您的代码尝试建立一个0数组,然后将递减值写入子数组。只是您错误地复制了它。应该是:

def pattern(n):
    d = n + (n - 1)
    l = [[0 for row in range(d)] for col in range(d)]
    for a in range(0, n):
        for i in range(a, d):
            for j in range(a, d):
                l[i][j]=n
        n -= 1
        d -= 1
    return l