标量组成的张量

定义

ti.``var(dt, shape = None, offset = None)

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

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

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

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

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

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

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

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

  1. x[None] = 2

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

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

注解

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

警告

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

  1. x = ti.var(ti.f32)
  2. x[None] = 1 # 错误:x没有放置!
  1. x = ti.var(ti.f32, shape=())
  2. @ti.kernel
  3. def func():
  4. x[None] = 1
  5. func()
  6. y = ti.var(ti.f32, shape=())
  7. # 错误:内核调用后不能再创建新的变量!
  1. x = ti.var(ti.f32, shape=())
  2. x[None] = 1
  3. y = ti.var(ti.f32, shape=())
  4. # 错误:任一变量访问过后不能再创建新的变量!

访问分量

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

a[p, q, ...]

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

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

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

  1. x = a[3, 4]

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

  1. b[2] = 5

注解

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

注解

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

元数据

a.``shape

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

a.``dtype

参数:a – (张量)张量
返回:(数据类型) a 的数据类型
  1. x = ti.var(ti.i32, (2, 3))
  2. x.dtype # ti.i32

a.``parent(n = 1)

参数:
  • a – (张量)张量
  • n – (可选,标量)父级步数,即父级节点为 n = 1,祖父级节点为 n = 2,等等。
返回:

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

  1. x = ti.var(ti.i32)
  2. y = ti.var(ti.i32)
  3. blk1 = ti.root.dense(ti.ij, (6, 5))
  4. blk2 = blk1.dense(ti.ij, (3, 2))
  5. blk1.place(x)
  6. blk2.place(y)
  7. x.parent() # blk1
  8. y.parent() # blk2
  9. y.parent(2) # blk1

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