NDArray 是一个用 Swift 编写的多维数组库,旨在成为 Swift 新兴数据科学生态系统中 numpy
的等价物。这个项目还处于非常早期的阶段,前方还有一段漫长但令人兴奋的道路!
NDArray
及其操作具有可微性
,以便与 Swift for TensorFlow 一起使用。教程 | 最后更新 |
---|---|
基本 API | 2019 年 8 月 13 日 |
你可以使用 SwiftPM 安装它
.package(url: "https://github.com/cgarciae/NDArray", from: "0.0.20")
它可能适用于其他兼容的包管理器。此软件包仅在 Swift 5.1 中经过测试,不保证与早期版本的兼容性。
NDArray
是一种泛型容器类型,就像 Array
一样,不同之处在于它是多维的。 如果它的元素符合某些协议,那么可以使用某些方法和运算符,例如+
,-
,*
等,来有效地执行整个集合的计算。
import NDArray
let a = NDArray<Int>([
[1, 2, 3],
[4, 5, 6],
])
let b = NDArray<Int>([
[7, 8, 9],
[10, 11, 12],
])
print((a + b) * a)
/*
NDArray<Int>[2, 3]([
[8, 20, 36],
[56, 80, 108],
])
*/
在这里,我们看到 (a + b) * a
的结果也是一个形状为 [2, 3]
的 Int
类型的 NDArray
。 要将像 +
和 *
这样的运算符与包含您的自定义类型的 NDArray 一起使用,您只需使它们符合适当的协议。例如
import NDArray
struct Point: AdditiveArithmetic {
let x: Float
let y: Float
...
}
let a = NDArray<Point>([Point(x: 1, y: 2), Point(x: 2, y: 3)])
let b = NDArray<Point>([Point(x: 4, y: 5), Point(x: 6, y: 7)])
print(a + b)
/*
NDArray<Point>[2]([Point(x: 5.0, y: 7.0), Point(x: 8.0, y: 10.0)])
*/
您也可以对数据应用通用转换,之前的代码可以写成:
elementwise(a, b, apply: +)
// or
elementwise(a, b) { $0 + $1 }
对于大量计算,您可以使用并行版本
elementwiseInParallel(a, b) {
// code
return c
}
将来,NDArray
应该能够根据数据的类型和大小来估计最佳策略(串行/并行)。
除了基本API之外,NDArray的自动微分和线性代数优化功能应该是可选的,因此所有用户都可以访问该库,而无需考虑其环境,即,即使iOS开发人员无法访问TensorFlow的编译器或Lineal Algebra基础结构,也应该能够使用它。
第一个目标是使用纯 Swift 定义库的基本 API,无需额外的优化或可微性。 iOS/OSX 开发人员应该能够使用基本 API,而无需进行额外的设置。 如果可能,保持 NDArray 的 API 与 Swift for TensorFlow 的 Tensor API 紧密协调,以促进知识重用和免费文档也非常重要。
第二个目标是必须具备的,Swift for TensorFlow 的编译器具有自动微分功能,可以说是 ML 的未来,我们应该使用它。
第三个目标是您对任何 HPC 数字库的期望,该策略将通过使用 BLAS、LAPACK、Accelerate 或 MLIR 来专门针对数字类型的功能/操作,以加速计算。 另一方面,如果成功与 MLIR 集成,BLAS 和 LAPACK 可能不是必需的,并且 NDArray 可以轻松成为性能最高的数字库之一。
+
, -
, *
, \
实际上可以在任何时候开始,尽管在实现各种操作(例如 dot
)或归约(例如 sum
或 mean
)之前,它不会那么有用。
NDArray
符合 Differentiable
NDArrays
操作可微。点积 (dot)
Cristian Garcia – cgarcia.e88@gmail.com
在 MIT 许可证下分发。 有关更多信息,请参见 LICENSE。