合并与分割
tf.concat
tf.concat可以实现拼接操作.
格式:
tf.concat(values, axis, name='concat')
参数:
values: 一个 tensor 或 tensor listaxis: 操作的维度name: 数据名称, 默认为 “concat”
例子:
part_1 = tf.zeros([5, 3])print(part_1)part_2 = tf.ones([5, 3])print(part_2)# 竖向拼接result_1 = tf.concat([part_1, part_2], axis=0)print(result_1)# 横向拼接result_2 = tf.concat([part_1, part_2], axis=1)print(result_2)
输出结果:
tf.Tensor([[0. 0. 0.][0. 0. 0.][0. 0. 0.][0. 0. 0.][0. 0. 0.]], shape=(5, 3), dtype=float32)tf.Tensor([[1. 1. 1.][1. 1. 1.][1. 1. 1.][1. 1. 1.][1. 1. 1.]], shape=(5, 3), dtype=float32)tf.Tensor([[0. 0. 0.][0. 0. 0.][0. 0. 0.][0. 0. 0.][0. 0. 0.][1. 1. 1.][1. 1. 1.][1. 1. 1.][1. 1. 1.][1. 1. 1.]], shape=(10, 3), dtype=float32)tf.Tensor([[0. 0. 0. 1. 1. 1.][0. 0. 0. 1. 1. 1.][0. 0. 0. 1. 1. 1.][0. 0. 0. 1. 1. 1.][0. 0. 0. 1. 1. 1.]], shape=(5, 6), dtype=float32)
tf.stack
tf.stack可以创建一个新的维度来合并两个张量.
格式:
tf.stack(values, axis=0, name='stack')
参数:
values: 一个 tensor listaxis: 操作的维度name: 数据名称, 默认为 “stack”
例子:
part_1 = tf.zeros([5, 3])print(part_1)part_2 = tf.ones([5, 3])print(part_2)# 头拼接result_1 = tf.stack([part_1, part_2], axis=0)print(result_1)# 尾拼接result_2 = tf.stack([part_1, part_2], axis=2)print(result_2)
输出结果:
tf.Tensor([[0. 0. 0.][0. 0. 0.][0. 0. 0.][0. 0. 0.][0. 0. 0.]], shape=(5, 3), dtype=float32)tf.Tensor([[1. 1. 1.][1. 1. 1.][1. 1. 1.][1. 1. 1.][1. 1. 1.]], shape=(5, 3), dtype=float32)tf.Tensor([[[0. 0. 0.][0. 0. 0.][0. 0. 0.][0. 0. 0.][0. 0. 0.]][[1. 1. 1.][1. 1. 1.][1. 1. 1.][1. 1. 1.][1. 1. 1.]]], shape=(2, 5, 3), dtype=float32)tf.Tensor([[[0. 1.][0. 1.][0. 1.]][[0. 1.][0. 1.][0. 1.]][[0. 1.][0. 1.][0. 1.]][[0. 1.][0. 1.][0. 1.]][[0. 1.][0. 1.][0. 1.]]], shape=(5, 3, 2), dtype=float32)
tf.unstack
tf.unstack是一个矩阵分解函数.格式:
# unstacktf.unstack(value, num=None, axis=0, name='unstack')
参数:
values: 一个 tensor, 维度大于 0num: 轴的长度axis: 操作的维度name: 数据名称, 默认为 “unstack”
例子:
a = tf.stack([tf.zeros([5, 3]), tf.ones([5, 3])], axis=0)print(a)b = tf.unstack(a, axis=0)print(b)
输出结果:
tf.Tensor([[[0. 0. 0.][0. 0. 0.][0. 0. 0.][0. 0. 0.][0. 0. 0.]][[1. 1. 1.][1. 1. 1.][1. 1. 1.][1. 1. 1.][1. 1. 1.]]], shape=(2, 5, 3), dtype=float32)[<tf.Tensor: shape=(5, 3), dtype=float32, numpy=array([[0., 0., 0.],[0., 0., 0.],[0., 0., 0.],[0., 0., 0.],[0., 0., 0.]], dtype=float32)>, <tf.Tensor: shape=(5, 3), dtype=float32, numpy=array([[1., 1., 1.],[1., 1., 1.],[1., 1., 1.],[1., 1., 1.],[1., 1., 1.]], dtype=float32)>]
tf.split
tf.split()可以把一个张量划分为几个子张量.
格式:
tf.split(value, num_or_size_splits, axis=0, num=None, name='split')
参数:
value: 待切分的张量num_or_size_splits: 切成几份axis: 操作的维度num:num_or_size_splits不能实现的情况下使用name: 数据名称, 默认为 “split”
例子:
# splita = tf.stack([tf.zeros([5, 3]), tf.ones([5, 3])], axis=0)print(a)b = tf.split(a, 2)print(b)
输出结果:
tf.Tensor([[[0. 0. 0.][0. 0. 0.][0. 0. 0.][0. 0. 0.][0. 0. 0.]][[1. 1. 1.][1. 1. 1.][1. 1. 1.][1. 1. 1.][1. 1. 1.]]], shape=(2, 5, 3), dtype=float32)[<tf.Tensor: shape=(1, 5, 3), dtype=float32, numpy=array([[[0., 0., 0.],[0., 0., 0.],[0., 0., 0.],[0., 0., 0.],[0., 0., 0.]]], dtype=float32)>, <tf.Tensor: shape=(1, 5, 3), dtype=float32, numpy=array([[[1., 1., 1.],[1., 1., 1.],[1., 1., 1.],[1., 1., 1.],[1., 1., 1.]]], dtype=float32)>]
数据统计
tf.norm
tf.norm可以计算向量, 矩阵, 张量的范数.
格式:
tf.norm(tensor, ord='euclidean', axis=None, keepdims=None, name=None)
参数:
tensor: 输入的张量ord: 范数的顺序axis: 操作的维度keep_dims: 如果为True, 则axis中指定的轴将保持为大小 1name: 数据名称
例子:
a = tf.fill([2, 2], 2.0)print(a)# sqrt(2^2 * 4) = sqrt(16) = 4b = tf.norm(a)print(b)# [2 + 2, 2 + 2] = [4, 4]c = tf.norm(a, ord=1, axis= 0)print(c)# [sqrt(2^2 + 2^2), sqrt(2^2 + 2^2)] = [sqrt(8), sqrt(8)]d = tf.norm(a, ord=2, axis= 0)print(d)
输出结果:
tf.Tensor([[2. 2.][2. 2.]], shape=(2, 2), dtype=float32)tf.Tensor(4.0, shape=(), dtype=float32)tf.Tensor([4. 4.], shape=(2,), dtype=float32)tf.Tensor([2.828427 2.828427], shape=(2,), dtype=float32)
reduce_min/max/mean
计算一个张量各个维度上元素的最小值 / 最大值 / 平均值.
格式:
tf.math.reduce_min / reduce_max / reduce_mean(input_tensor, axis=None, keepdims=False, name=None)
参数:
input_tensor: 传入的张量axis: 维度, 默认计算所有维度keepdims: 如果为真保留维度, 默认为Falsename: 数据名称
例子:
a = tf.reshape(tf.range(9), [3, 3])print(a)min = tf.reduce_min(a)print(min)max = tf.reduce_max(a)print(max)
输出结果:
tf.Tensor([[0 1 2][3 4 5][6 7 8]], shape=(3, 3), dtype=int32)tf.Tensor(0, shape=(), dtype=int32)tf.Tensor(8, shape=(), dtype=int32)
argmax / argmin
tf.argmax/tf.argmin可以找到最大 / 最小值所在的索引 (index).
格式:
tf.math.argmax(input, axis=None, output_type=tf.dtypes.int64, name=None)
参数:
input: 输入axis: 操作的维度output_type: 输出数据类型, 默认为 int64name: 数据名称
例子:
# argmax / argmina = tf.reshape(tf.range(9), [3, 3])print(a)max = tf.argmax(a)print(max)min = tf.argmin(a)print(min)
输出结果:
tf.Tensor([[0 1 2][3 4 5][6 7 8]], shape=(3, 3), dtype=int32)tf.Tensor([2 2 2], shape=(3,), dtype=int64)tf.Tensor([0 0 0], shape=(3,), dtype=int64)
tf.equal
tf.equal可以判断两个张量是否相等, 返回 True / False.
格式:
tf.math.equal(x, y, name=None)
例子:
a = tf.zeros(5, dtype=tf.float32)print(a)b = tf.range(5, dtype=tf.float32)print(b)print(tf.equal(a, b))
输出结果:
tf.Tensor([0. 0. 0. 0. 0.], shape=(5,), dtype=float32)tf.Tensor([0. 1. 2. 3. 4.], shape=(5,), dtype=float32)tf.Tensor([ True False False False False], shape=(5,), dtype=bool)
tf.unique
tf.unique可以找出张量中不重复的值
格式:
tf.unique(x, out_idx=tf.dtypes.int32, name=None)
参数:
input: 输入output_type: 输出数据类型, 默认为 int32name: 数据名称
例子:
a = tf.range(5)print(tf.unique(a))b = tf.constant([4, 2, 2, 4, 3])print(tf.unique(b))
输出结果:
Unique(y=<tf.Tensor: shape=(5,), dtype=int32, numpy=array([0, 1, 2, 3, 4])>, idx=<tf.Tensor: shape=(5,), dtype=int32, numpy=array([0, 1, 2, 3, 4])>)Unique(y=<tf.Tensor: shape=(3,), dtype=int32, numpy=array([4, 2, 3])>, idx=<tf.Tensor: shape=(5,), dtype=int32, numpy=array([0, 1, 1, 0, 2])>)
