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_nd
(https://www.tensorflow.org/api_docs/python/tf/scatter_nd)但是现在我不明白如何使用它。如果我理解正确,我不能使用indices
形状大于update
数组的形状(即我不能使用indices
形状(3,4,5,3)
和{{1如果是这样的话,那么这个操作似乎没用,直到我创建了具有我需要在结果中形成的形状的中间数组。
update
的模拟将是有用的。
答案 0 :(得分:2)
张量流到np.take
的最近函数是tf.gather
和tf.gather_nd
。
tf.gather_nd
比tf.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()))