Tensorflow:类似于numpy.take?

时间:2017-07-08 07:40:54

标签: arrays numpy tensorflow

numpy.take是否有类似物? 我希望从N+1 - 维数组中形成N - 维数组,更确切地说,从形状为(B, H, W, C)的数组形成{我想制作(B, H, W, X, C)数组。

我认为,就我的情况而言,即使没有这样的一般操作也有解决方案。但我真的不确定如果我将编写具有多个中间操作和张量(移位,重复等)的代码,TF将能够优化它并删除不必要的操作。此外,我认为这样的代码将是不洁净的,而且非常糟糕。

我想添加带有移位值的维度。即对于(H,W) - >(H,W,3)维度,案例索引必须是

[
[[0,0], #[0,-1], may be padding with zeros but for now pad with edge value
[0,0],
[0,1]],

[[0,0],
[0,1]
[0,2]]
...
[[1,0],
 [1,0],
 [1,1]],

 [[1,0],
 [1,1],
 [1,2]],
...
]

我想过tf.scatter_ndhttps://www.tensorflow.org/api_docs/python/tf/scatter_nd)但是现在我不明白如何使用它。如果我理解正确,我不能使用indices形状大于update数组的形状(即我不能使用indices形状(3,4,5,3)和{{1如果是这样的话,那么这个操作似乎没用,直到我创建了具有我需要在结果中形成的形状的中间数组。

UPD:可能是我错了,张量操作(移位,平铺等)是更合适和有效的解决方案。 但无论如何,我认为update的模拟将是有用的。

2 个答案:

答案 0 :(得分:2)

张量流到np.take的最近函数是tf.gathertf.gather_nd

tf.gather_ndtf.gather(以及np.take)更通用,因为它可以同时切割多个维度。

tf.gather[_nd]np.take相比的明显限制是它们仅切割张量的第一维 - 您无法切入内部维度。如果要切换任意维度(如在您的情况下),则需要转置数组以将切片尺寸放在第一位,收集,然后转置回来。

答案 1 :(得分:0)

tf.gather代替np.take的示例代码:

import numpy as np

a = np.array([5, 7, 42])
b = np.random.randint(0, 3, (2, 3, 4))
c = a[b]
result_numpy = np.take(a, b)

print(a, b, c, result_numpy)

import tensorflow as tf

a = tf.convert_to_tensor(a)
b = tf.convert_to_tensor(b)
# c = a[b] # does not work
result_tf = tf.gather(a, b)

print(a, b, result_tf)

assert(np.array_equal(result_numpy, result_tf.numpy()))