MNN/docs/pymnn/Var.md

712 lines
11 KiB
Markdown
Executable File
Raw 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'>
```