Files
2026-07-13 13:33:03 +08:00

712 lines
11 KiB
Markdown
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## expr.Var
```python
class Var
```
Var是MNN V3及表达式接口中的基础数据结构,是对数据和表达式的封装类型。Var存储了计算表达式,数据以及数据类型,形状等诸多信息,用户可以通过Var本身的函数获取这些信息。
在numpy和cv接口中,Var的作用等价于`numpy.ndarray`
---
### `expr.dtype`
描述Var的数据类型
- 类型:`Enum`
- 枚举值:
- `double`
- `float`
- `int`
- `int64`
- `uint8`
---
### `expr.data_format`
描述Var的数据排布格式
- 类型:`Enum`
- 枚举值:
- `NCHW`
- `NC4HW4`
- `NHWC`
---
### `Var()`
使用`expr.const``MNN.numpy.array`创建Var
*不要使用Var()来创建Var的变量,应该使用expr/numpy中提供的函数来创建Var*
---
### `valid`
该Var是否有效,如果无效,则不能使用, *作为表达式输入异常或无效的表达式的输出,Var都是无效的*
返回:Var的数据形状
返回类型:`[int]`
---
### `shape`
获取Var的形状
返回:Var的数据形状
返回类型:`[int]`
---
### `data_format`
获取Var的数据排布格式
属性类型:只读
类型:`expr.data_format`
---
### `dtype`
获取Var的数据类型
属性类型:只读
类型:`expr.dtype`
---
### `size`
获取Var的元素个数
属性类型:只读
类型:`int`
---
### `name`
获取Var的名称
属性类型:只读
类型:`str`
---
### `ndim`
获取Var的维度数量
属性类型:只读
类型:`int`
---
### `ptr`
获取Var的数据指针
属性类型:只读
类型:`PyCapsule`
---
### `op_type`
获取Var对应表达式的Op类型
属性类型:只读
类型:`str`
---
### `fix_as_placeholder()`
将Var作为Placeholder,执行该函数后可以对该变量执行写操作
*注意:表达式中使用,numpy数值计算时勿使用*
参数:
- `None`
返回:`None`
返回类型:`None`
---
### `fix_as_const()`
将Var作为Const,执行该操作会立即计算出该变量的值并设置为常量
*注意:表达式中使用,numpy数值计算时勿使用*
参数:
- `None`
返回:`None`
返回类型:`None`
---
### `fix_as_trainable()`
将Var作为Trainable,执行该操作会将该变量设置为可训练变量
*注意:表达式中使用,numpy数值计算时勿使用*
参数:
- `None`
返回:`None`
返回类型:`None`
---
### `close()`
将Var的输入设置为空
*注意:表达式中使用,numpy数值计算时勿使用*
参数:
- `None`
返回:`None`
返回类型:`None`
---
### `copy_from(src)`
将src设置为Var的输入
*注意:表达式中使用,numpy数值计算时勿使用*
参数:
- `src:Var` 源变量
返回:`None`
返回类型:`None`
---
### `set_inputs(inputs)`
将inputs设置为Var的输入
*注意:表达式中使用,numpy数值计算时勿使用*
参数:
- `inputs:[Var]` 源变量
返回:`None`
返回类型:`None`
---
### `replace(src)`
使用src替换掉该Var
*注意:表达式中使用,numpy数值计算时勿使用*
参数:
- `src:Var` 替换变量
返回:`None`
返回类型:`None`
---
### `reorder(format)`
将Var的数据排布格式设置为format
*注意:表达式中使用,numpy数值计算时勿使用*
参数:
- `format:expr.data_format` 数据排布格式
返回:`None`
返回类型:`None`
---
### `resize(shape)`
将Var的形状设置为shape
*注意:表达式中使用,numpy数值计算时勿使用*
参数:
- `shape:[int]` 形状
返回:`None`
返回类型:`None`
---
### `read()`
读取Var的数据,返回numpy.ndarray数据
*注意:该API仅在PYMNN_NUMPY_USABLE打开的情况下有效,移动端默认关闭*
参数:
- `None`
返回:Var数据的numpy形式
返回类型:`numpy.ndarray`
---
### `read_as_tuple()`
读取Var的数据,返回tuple数据
参数:
- `None`
返回:Var数据的tuple形式
返回类型:`tuple`
---
### `write(data)`
将data中的数据写入Vardata可以是numpy.ndarray或tuple类型
*注意:该函数在使用`numpy`时经常被用作`ndarray->Var`的转换函数,在使用`MNN.numpy`时不需要使用该函数*
参数:
- `data:tuple|ndarray` 待写入数据
返回:`None`
返回类型:`None`
---
### `all(axis)`
Var中指定轴的数据是否全不为0,相当于: `for x in data: res &= x`
*要求Var的数据类型为int32*
参数:
- `axis:[int]` 指定的轴,默认为[-1]
返回:`True`全不为0`False`包含0
返回类型:`bool`
---
### `any(axis)`
Var中指定轴的数据是否至少有一个数据不为0,相当于: `for x in data: res |= x`
*要求Var的数据类型为int32*
参数:
- `axis:[int]` 指定的轴,默认为[-1]
返回:`True`至少有一个数据不为0`False`全部为0
返回类型:`bool`
---
### `argmax(axis)`
返回Var中指定轴的最大值的索引
参数:
- `axis:[int]` 指定的轴,默认为[-1]
返回:最大值的索引
返回类型:`int`
---
### `argmin(axis)`
返回Var中指定轴的最小值的索引
参数:
- `axis:[int]` 指定的轴,默认为[-1]
返回:最小值的索引
返回类型:`int`
---
### `sort(axis)`
将Var按照axis的方向排序
参数:
- `axis:int` 排序的轴,默认为[-1]
返回:排序后的Var
返回类型:`Var`
---
### `argsort(axis)`
返回排序后各元素对应的位置
参数:
- `axis:[int]` 排序的轴,默认为[-1]
返回:元素的对应顺序
返回类型:`Var`
---
### `astype(type)`
将Var的数据类型设置为type
参数:
- `type:expr.dtype` 数据类型
返回:数据类型为type的变量
返回类型:`Var`
---
### `copy()`
返回一个拷贝的Var
参数:
- `None`
返回:一个拷贝的Var
返回类型:`Var`
---
### `dot(b)`
返回Var与b的点积
参数:
- `b:Var` 另一个变量
返回:Var与b的点积
返回类型:`Var`
---
### `fill(value)`
将Var的数据全部设置为value
参数:
- `value:scalar` 填充值
返回:全部设置为value的变量
返回类型:`Var`
---
### `flatten()`
将Var的数据展平,相当于 `reshape(-1)`
参数:
- `None`
返回:展平的变量
返回类型:`Var`
---
### `max(axis)`
返回Var指定轴的最大值
参数:
- `axis:[int]` 指定的轴,默认为[-1]
返回:最大值
返回类型:`float`
---
### `mean(axis)`
返回Var指定轴的均值
参数:
- `axis:[int]` 指定的轴,默认为[-1]
返回:均值
返回类型:`float`
---
### `min()`
返回Var中最小值
参数:
- `None`
返回:最小值
返回类型:`float`
---
### `nonzero()`
返回Var中不为0的元素的坐标
参数:
- `None`
返回:不为0的元素的坐标
返回类型:`(Var,)`
---
### `prod()`
返回Var的乘积
参数:
- `None`
返回:乘积
返回类型:`float`
---
### `ptp()`
返回Var的最大值与最小值的差
参数:
- `None`
返回:最大值与最小值的差
返回类型:`float`
---
### `ravel()`
返回Var的数据展平,相当于 `reshape(-1)`
参数:
- `None`
返回:展平的变量
返回类型:`Var`
---
### `repeat(num)`
将Var重复num次
参数:
- `num:int` 重复次数
返回:重复num次的变量
返回类型:`Var`
---
### `reshape(shape)`
将Var的数据reshape为shape
参数:
- `shape:[int]` 新的形状
返回:形状为shape的变量
返回类型:`Var`
---
### `squeeze(axis)`
将Var中指定轴且维度为1的维度移除
参数:
- `axis:[int]` 要移除的轴, 默认为[-1]
返回:移除维度为1的变量
返回类型:`Var`
---
### `round()`
将Var的数据四舍五入
参数:
- `None`
返回:四舍五入的变量
返回类型:`Var`
---
### `sum(axis)`
返回Var指定轴的和
参数:
- `axis:[int]` 指定的轴, 默认为[-1]
返回:和
返回类型:`Var`
---
### `var(axis)`
返回Var指定轴的方差
参数:
- `axis:[int]` 指定的轴, 默认为[-1]
返回:标准差
返回类型:`Var`
---
### `std(axis)`
返回Var指定轴的标准差
参数:
- `axis:[int]` 指定的轴, 默认为[-1]
返回:标准差
返回类型:`Var`
---
### `swapaxes(axis1, axis2)`
将Var的指定轴交换
参数:
- `axis1:int` 指定的交换轴
- `axis2:int` 指定的交换轴
返回:交换后的变量
返回类型:`Var`
---
### `transpose(axes)`
将Var转置
参数:
- `axes:[int]` 转置的轴顺序,默认为`None`, 将轴逆序排列
返回:转置后的变量
返回类型:`Var`
---
### `item(idx)`
返回Var的第idx个元素,类似:`var[idx]`
参数:
- `idx:int` 元素的索引
返回:元素的值
返回类型:`Var`
---
### `number_overload`
- `+`
- `-`
- `*`
- `/`
- `%`
- `**`
- `abs()`
### `compare_overload`
- `==`
- `!=`
- `<`
- `<=`
- `>`
- `>=`
### `sequence_overload`
- `__iter__`, `__iternext__` 可以通过`for item in var`遍历Var
- `__len__` 返回最高维度的长度
- `__subscript__`
- `int` 如:`x[0]`
- `[int]` 如:`x[[0,2]]`
- `Var` 数据类型为int或bool,如: `x[x > 0]`
- `PySlice` 如:`x[:, 2], x[0:10:-1]`
- `__ass_subscript__``__subscript__` 相同,是赋值操作
### `str_overload`
- `__repr__`, `__str__` 在支持numpy的环境中打印格式与numpy一致,否则以tuple形式打印
### `not_impl_overload`
- `float(var)`
- `max(var1, var2)`
- `if var:`
- *注意:以上均为未定义行为,请勿使用!!!*
---
### `Example`
```python
import MNN.expr as expr
import MNN.numpy as np
# 创建Var变量
# 通过expr.const创建变量,参数分别为:数据,形状,数据排布,数据类型
x = expr.const([1., 2., 3., 4.], [2, 2], F.NCHW, F.float) # array([[1., 2.], [3., 4.]], dtype=float32)
# 通过numpy.array创建变量,直接传入数据即可
y = np.array([2, 0]) # array([2, 0], dtype=int32)
# 通过numpy.ones创建变量,指定参数为形状
z = np.ones([4]) # array([1, 1, 1, 1], dtype=int32)
# Var的属性
x.shape # [2, 2]
x.size # 4
x.ndim # 2
x.dtype # dtype.float
x.data_format # data_format.NCHW
x.op_type # 'Const'
# 形状变化
x1 = x.reshape(1, 4) # array([[1., 2., 3., 4.]], dtype=float32)
x2 = x.transpose() # array([[1., 3.], [2., 4.]], dtype=float32)
x3 = x.flatten() # array([1., 2., 3., 4.], dtype=float32)
# 运算符重载
x4 = x3 + z # array([3., 5., 7., 9.], dtype=float32)
x5 = x3 > z # array([0, 1, 1, 1], dtype=int32)
# 数学函数
x.max() # 4.0
x.std() # 1.1180340051651
x.sum() # 10.0
# 元素操作,可以通过索引、切片、迭代等方式进行操作
x[0] # array([1., 2.], dtype=float32)
x[0, 1] # 2.0
x[:, 0] # array([1., 3.], dtype=float32)
x.item(1) # 2.0
len(x) # 2
for item in x:
print(item) # array([1., 2.], dtype=float32); array([3., 4.], dtype=float32)
# 数据类型转换:到ndarray, tuple, scalar
np_x = x.read() # array([[1., 2.], [3., 4.]], dtype=float32)
type(np_x) # <class 'numpy.ndarray'>
tuple_x = x.read_as_tuple() # (1.0, 2.0, 3.0, 4.0)
type(tuple_x) # <class 'tuple'>
scalar_x = x[0, 1] # 1.0
type(scalar_x) # <class 'float'>
```