请问下为什么这种写法ti.ndarray就不行,而ti.Vector.field就可以呢?

import taichi as ti
ti.init()
pos = ti.ndarray(dtype=ti.math.vec2, shape=(100))
@ti.kernel
def test():
    pos[2][1] = 1.0
test()

报错

(base) PS C:\dev\tiPBD> & C:/Users/cl-w/miniconda3/python.exe c:/Users/cl-w/Desktop/err.py
[Taichi] version 1.4.1, llvm 15.0.1, commit e67c674e, win, python 3.10.9
[Taichi] Starting on arch=x64
Traceback (most recent call last):
  File "c:\Users\cl-w\Desktop\err.py", line 7, in <module>
    test()
  File "C:\Users\cl-w\miniconda3\lib\site-packages\taichi\lang\kernel_impl.py", line 976, in wrapped
    raise type(e)('\n' + str(e)) from None
taichi.lang.exception.TaichiCompilationError:
File "c:\Users\cl-w\Desktop\err.py", line 6, in test:
    pos[2][1] = 1.0
    ^^^^^^
Traceback (most recent call last):
  File "C:\Users\cl-w\miniconda3\lib\site-packages\taichi\lang\ast\ast_transformer_utils.py", line 25, in __call__
    return method(ctx, node)
  File "C:\Users\cl-w\miniconda3\lib\site-packages\taichi\lang\ast\ast_transformer.py", 
line 238, in build_Subscript
    node.ptr = impl.subscript(ctx.ast_builder, node.value.ptr,
  File "C:\Users\cl-w\miniconda3\lib\site-packages\taichi\lang\util.py", line 300, in wrapped
    return func(*args, **kwargs)
  File "C:\Users\cl-w\miniconda3\lib\site-packages\taichi\lang\impl.py", line 142, in subscript
    return value.__getitem__(_indices)
  File "C:\Users\cl-w\miniconda3\lib\site-packages\taichi\lang\util.py", line 308, in wrapped
    assert in_python_scope(), \
AssertionError: __getitem__ cannot be called in Taichi-scope

而换成vector field就可以通过

import taichi as ti
ti.init()
pos = ti.Vector.field(2, dtype=ti.f32, shape=(100))
@ti.kernel
def test():
    pos[2][1] = 1.0
test()
import taichi as ti
ti.init()
pos = ti.ndarray(dtype=ti.math.vec2, shape=(100))
@ti.kernel
def test(pos: ti.types.ndarray()):
    pos[2][1] = 1.0
test(pos)

需要把ndarray传进function,不传进去访问的只是pos这个Python侧的expr,不是实际的ndarray;field可以认为是全局存在的,所以不用传