建立在张量代数编译器上的稠密和稀疏张量库。

tensora的Python项目详细描述


Tensora

一个快速且易于使用的python密集/稀疏张量库。使用各种稀疏格式的张量计算任意张量表达式。

张量是矩阵的n维推广。张量不局限于1维或2维,而是可以有3维、4维或更多维。它们在各种应用中都很有用。numpy是python中最著名的张量库;它的中心ndarray对象是密集张量的一个例子。

在稠密张量中,每个元素都显式地存储在内存中。如果绝大多数元素是零,那么这是一个低效的布局,需要更多的内存存储和更多的时间操作。有许多不同的稀疏张量格式,每一种格式的优劣取决于张量的哪些元素是非零的。

许多张量核(在具有特定稀疏格式的张量之间执行特定代数计算的函数)都是为解决特定问题而编写的。最近,张量代数编译器(taco)被发明来自动构造和优化任意稀疏格式的任意代数表达式的张量核。taco接受一个代数表达式和表达式中每个张量格式的描述,并返回一个c函数,该函数可以有效地计算这些张量参数的给定表达式。

Tensora是一个包裹玉米卷的Python包装器。tensor a有一个中心类tensor它只是有一个指针指向c内存中保存的taco tensor,由cffi包管理。tensora公开了采用一个代数表达式字符串并返回python函数的函数,python函数在快速c代码中执行该操作。为了做到这一点,字符串被解析并传递给taco;由taco生成的c代码由cffi"动态"编译,然后由提供良好错误处理的代码包装。

此软件包具有很强的实验性。在没有独立验证任何特定问题的输出之前,不要相信结果。这主要是因为底层的taco编译器本身具有很强的实验性。由于生成的内核中存在已知的底层错误,tensora的大部分测试套件都被跳过。随着对taco的研究不断深入,tensora的测试套件将不断扩充,文档也将不断完善。

开始

Tensora可以使用来自PYPI的PIP安装:

pip install tensora

tensor和函数evaluate一起为tensora提供了瓷接口。

下面是将csr格式的稀疏矩阵与密集向量相乘的示例:

fromtensoraimportTensor,evaluateelements={(1,0):2.0,(0,1):-2.0,(1,2):4.0,}A=Tensor.from_dok(elements,dimensions=(2,3),format='ds')x=Tensor.from_lol([0,-1,2])y=evaluate('y(i) = A(i,j) * x(j)','d',A=A,x=x)asserty==Tensor.from_lol([2,4])

创建张量

创建张量最好通过tensor.from_*方法来完成。这些方法将各种数据类型转换为张量。大多数转换方法都可以选择同时采用维度和格式来确定结果张量的维度和格式。

来自"lol":列表列表

Tensor.from_lol(lol,*,dimensions:Tuple[int,...]=None,format:Union[Format,str]=None)

将密集列表转换为张量

  • lol是一个列表列表,可能嵌套得很深。也就是说,lol是一个float、一个list[float]、一个list[list[float]等任意深度到lists的值。这些值以行主格式读取,这意味着顶级列表是第一个维度和最深的列表(包含actu的列表是最后一个维度。同一级别的所有列表必须具有相同的长度。对于熟悉的人来说,这与通过numpy.array>从列表列表构造数组时的numpy行为相同。

  • 维度有一个默认值,该值是从lol的结构中推断出来的。如果PR提供时,它必须与lol的结构一致。提供尺寸通常仅在一个或多个非最终尺寸可能为零时才有用。例如,tensor.from_lol([[],[]])的维数为(2,0),而tensor.from_lol([[],[]],dimensions=(2,0,3))的维数为(2,0,3)

  • format具有所有密集维度的默认值。

来自"Dok":钥匙字典

Tensor.from_dok(dok:Dict[Tuple[int,...],float],*,dimensions:Tuple[int,...]=None,format:Union[Format,str]=None)

将键字典转换为张量

  • dok是一个python字典,其中每个键是一个非零值的坐标,条目的值是该坐标处张量的值。所有未提及的坐标都隐式为零。

  • 尺寸有一个默认值,该值是在坐标中找到的每个尺寸中最大的尺寸。

  • format的默认值是密集维度,只要非零的数量大于这些维度的乘积,然后是稀疏维度。默认值随经验的变化而变化。

来自AOS:结构数组

Tensor.from_aos(aos:Iterable[Tuple[int,...]],values:Iterable[float],*,dimensions:Tuple[int,...]=None,format:Union[Format,str]=None)

将坐标列表和相应的值列表转换为张量

  • aos是非零值的坐标值。

  • 的长度必须与aos的长度相同,并且每个值都是对应坐标处的非零值。

  • 尺寸张量具有相同的默认值。从u dok开始,每个尺寸中的最大尺寸。

  • 格式张量具有相同的默认值。从'u dok开始,根据需要对许多维度进行密集以适合非零。

来自AOS:数组结构

Tensor.from_soa(soa:Tuple[Iterable[int],...],values:Iterable[float],*,dimensions:Tuple[int,...]=None,format:Union[Format,str]=None)

将每个维度的索引列表和相应的值列表转换为张量

  • soa是iterable的元组,其中每个iterable是对应维度的所有索引。所有电缆长度必须相同。

  • 必须与坐标系中的iterable长度相同,并且每个值都是对应坐标系下的非零值。

  • 尺寸张量具有相同的默认值。从u dok开始,每个尺寸中的最大尺寸。

  • 格式张量具有相同的默认值。从'u dok开始,根据需要对许多维度进行密集以适合非零。

从numpy中:转换numpy数组

Tensor.from_numpy(array:numpy.ndarray,*,format:Union[Format,str]=None)

将numpy数组转换为张量

  • 数组是任意数组。生成的张量将具有相同的顺序、维数和数组值。

  • format具有所有密集维度的默认值。

来自scipy稀疏矩阵:转换scipy稀疏矩阵

Tensor.from_scipy_sparse(data:scipy.sparse.spmatrix,*,format:Union[Format,str]=None)

将scipy稀疏矩阵转换为张量

  • matrix是任意的scipy.sparse.spmatrix。得到的张量具有相同的顺序、维数和矩阵值。张量的阶数总是2。

  • format对于csr_matrixd1s0对于csc_matrixds对于其他稀疏矩阵类型的默认值为ds,但随着taco添加新的格式模式类型,该值可能会发生更改。

计算表达式

taco为张量核的代数表达式生成核。tensora使用evaluate函数包装此过程。

evaluate(assignment:str,output_format:str,**inputs:Tensor)
  • 赋值可作为代数张量赋值。

  • output_format是输出张量的理想格式。

  • inputs是表达式的所有输入。赋值中的每个变量名都必须有一个命名参数。输入中张量的维数必须与赋值和彼此一致。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
图形Java仿射变换以旋转通用路径   IntelliJ IDEA中的java代码标记为编译器错误,在Eclipse中可以正常工作   java ArrayList的containsAll返回了错误的值   如何在安卓中的片段活动中添加java代码   java通过使用netbeans调用jbutton,将带有行的jbutton添加到jtable中   java在更新arrayAdapter/listView之前更新最终列表   java如何在另一个项目中导入包含AspectJ方面和注释的项目   为什么我的java布尔测试总是失败?   Eclipse中的java自动激活   在Bluetooth for Java(更具体地说是Android)之上是否有TCP/IP协议栈实现?   java Android Studio通过intent传递ArrayList并填充ListView