标量组成的张量¶
定义¶
-
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) 。