我有一个3维数组(array[x][y][z]
,x y z
可以灵活)
var array = [ [[1,1,1],[0,0,0],[1,1,1]],
[[1,0,1],[1,0,1],[1,0,1]],
[[1,1,1],[0,0,0],[1,1,1]]
]
如何将 3D 简化为 2D:array[z][y]
[3,1,3],[2,0,2],[3,1,3]
我阅读了说明here但不知道如何申请到我的。
最佳答案
让我们首先形成一个实用函数作为矩阵式数组的扩展(“cw”表示按列):
extension Array where Element == [[Int]] {
func cwsum(_ ix1:Int, _ ix2:Int) -> Int {
return reduce(0) {$0 + $1[ix1][ix2]}
}
}
那么如果数组是:
let array = [[[1,1,1],[0,0,0],[1,1,1]],
[[1,0,1],[1,0,1],[1,0,1]],
[[1,1,1],[0,0,0],[1,1,1]]]
...那么答案是:
[[array.cwsum(0,0), array.cwsum(1,0), array.cwsum(2,0)],
[array.cwsum(0,1), array.cwsum(1,1), array.cwsum(2,1)],
[array.cwsum(0,2), array.cwsum(1,2), array.cwsum(2,2)]]
// [[3, 1, 3], [2, 0, 2], [3, 1, 3]]
但是等等——我想我在这里看到了一种模式!我们可以重写它,而无需对索引进行硬编码,如下所示:
var result = [[Int]]()
for j in 0..<3 {
var r1 = [Int]()
for i in 0..<3 {
r1.append(array.cwsum(i,j))
}
result.append(r1)
} // result is now [[3, 1, 3], [2, 0, 2], [3, 1, 3]]
好的,但是我们可以在哪里循环和 append
,我们可以map
相反,从而变成i
进入 map 变量:
var result = [[Int]]()
for j in 0..<3 {
result.append((0..<3).map{i in array.cwsum(i,j)})
}
但是我们可以对 j
执行此操作也是如此——因此它变成了一行:
result = (0..<3).map{j in (0..<3).map{i in array.cwsum(i,j)}}
关于Swift - 如何减少矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43810327/