标量组成的张量

定义

ti.var(dt, shape = None, offset = None)
参数:
  • dt – (数据类型)张量元素的数据类型
  • shape – (可选,标量或元组)张量的形状
  • offset – (可选,标量或元组)请参见 Coordinate offsets

例如,这将创建一个具有四个 int32 作为元素的 稠密(dense) 张量:

x = ti.var(ti.i32, shape=4)

这将创建一个元素为 float32 类型的4x3 稠密 张量:

x = ti.var(ti.f32, shape=(4, 3))

如果 shape 是 () (空元组),则创建一个0-D张量(标量):

x = ti.var(ti.f32, shape=())

随后通过传递 None 作为索引来访问它:

x[None] = 2

如果形状参数 未提供 或指定为 None,则其后用户必须在手动放置 (place) 它:

x = ti.var(ti.f32)
ti.root.dense(ti.ij, (4, 3)).place(x)
# 等价于: x = ti.var(ti.f32, shape=(4, 3))

注解

通过不指定参数 shape 的写法,你可以将张量 放置 为默认的 稠密数据布局 之外的其他布局中,有关更多详细信息,请参见: Advanced dense layouts

警告

在任何内核调用或变量访问之前,所有变量都必须被创建和放置完毕。例如:

x = ti.var(ti.f32)
x[None] = 1 # 错误:x没有放置!
x = ti.var(ti.f32, shape=())
@ti.kernel
def func():
    x[None] = 1

func()
y = ti.var(ti.f32, shape=())
# 错误:内核调用后不能再创建新的变量!
x = ti.var(ti.f32, shape=())
x[None] = 1
y = ti.var(ti.f32, shape=())
# 错误:任一变量访问过后不能再创建新的变量!

访问分量

您可以通过一个或多个索引来访问 Taichi 张量的元素。

a[p, q, ...]
参数:
  • a – (张量)标量张量
  • p – 第一个张量维度的(标量)索引
  • q – 第二个张量维度的(标量)索引
返回:

(标量) [p, q, ...] 处的元素

这将提取张量 a 在索引为 [3, 4] 处的元素值:

x = a[3, 4]

这会将一维张量 b 在索引 2 处的元素值设置为 5

b[2] = 5

注解

在 Python 中, x[(exp1, exp2, …, expN)] 等效于 x[(exp1, exp2, …, expN)] ; 后者只是前者的语法糖。

注解

如果 a 是由 Vector / Matrix 构成的张量,则返回的值也可以是 Vector / Matrix,有关更多详细信息,请参见: 向量

元数据

a.shape
参数:a – (张量)张量
返回:(元组)张量 a 的形状
x = ti.var(ti.i32, (6, 5))
x.shape  # (6, 5)

y = ti.var(ti.i32, 6)
y.shape  # (6,)

z = ti.var(ti.i32, ())
z.shape  # ()
a.dtype
参数:a – (张量)张量
返回:(数据类型) a 的数据类型
x = ti.var(ti.i32, (2, 3))
x.dtype  # ti.i32
a.parent(n = 1)
参数:
  • a – (张量)张量
  • n – (可选,标量)父级步数,即父级节点为 n = 1,祖父级节点为 n = 2,等等。
返回:

(结构节点) a 所属结构节点的父类节点

x = ti.var(ti.i32)
y = ti.var(ti.i32)
blk1 = ti.root.dense(ti.ij, (6, 5))
blk2 = blk1.dense(ti.ij, (3, 2))
blk1.place(x)
blk2.place(y)

x.parent()   # blk1
y.parent()   # blk2
y.parent(2)  # blk1

有关更多详细信息,请参见 Structural nodes (SNodes)