---
title: WhereOperation
description: "| 硬件型号 | 是否支持 | 特殊说明 |"
url: https://www.hiascend.com/document/detail/zh/canncommercial/latest/API/ascendtb/ascendtb_01_0086.html
sourcePath: /source/zh/canncommercial/900/API/ascendtb/ascendtb_01_0086.html
indexId: 8039f26a236c77a816fa20507d1c658149e27c9360c8544d7a94457e238699b364
---
# WhereOperation

#### 产品支持情况

| 硬件型号 | 是否支持 | 特殊说明 |
| --- | --- | --- |
| Atlas 350 加速卡 | x | \- |
| Atlas A3 推理系列产品 / Atlas A3 训练系列产品 | √ | \- |
| Atlas A2 训练系列产品 / Atlas A2 推理系列产品 | √ | \- |
| Atlas 训练系列产品 | √ | \- |
| Atlas 推理系列产品 | √ | 不支持bf16数据类型。 |
| Atlas 200I/500 A2 推理产品 | √ | \- |


#### 功能说明

三目运算。

输入张量为cond, x, y，输出张量z。

- 输入：
  cond（条件张量）：定义了每个元素的选择条件。

  x：当条件为 1时，选择的第一个输入张量。

  y：当条件为0时，选择的第二个输入张量。

- 输出：输出张量的每个元素根据对应位置的条件从x或y中选取，返回一个和x、y形状相同的张量。
  z = (cond == 1 ? x : y)


#### 算子上下文


#### 定义

```
struct WhereParam {
    uint8_t rsv[8] = {0};
};
```


#### 参数列表

| 成员名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| rsv[8] | uint8\_t | {0} | 预留参数。 |


#### 输入

| 参数 | 维度 | 数据类型 | 格式 | 描述 |
| --- | --- | --- | --- | --- |
| cond | [dim\_0, dim\_1, ..., dim\_n] | int8 | ND | 输入tensor1，条件变量。 |
| x | [x\_dim\_0, x\_dim\_1, ..., x\_dim\_n] | float16 | ND | 输入tensor2。 |
| y | [y\_dim\_0, y\_dim\_1, ..., y\_dim\_n] | float16 | ND | 输入tensor3。 |


#### 输出

| 参数 | 维度 | 数据类型 | 格式 | 描述 |
| --- | --- | --- | --- | --- |
| z | [z\_dim\_0, z\_dim\_1, ..., z\_dim\_n] | float16 | ND | 输出tensor |


#### 约束说明

输入cond的元素只能是0或者1。输出z的维度为输入x与y广播后的结果。cond既需要满足可以单向广播至x，又需要满足单向广播至y。


#### 接口调用示例

输入：

```
cond = [[1, 0],
[0, 1]]
x = [[1, 2],
[3, 4]]
y = [[10, 20],
[30, 40]]
```

输出：

```
z = [[ 1, 20],
[30, 4]]
```
