Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Tensorflow:numpy.take的类似物?_Arrays_Numpy_Tensorflow - Fatal编程技术网

Arrays Tensorflow:numpy.take的类似物?

Arrays Tensorflow:numpy.take的类似物?,arrays,numpy,tensorflow,Arrays,Numpy,Tensorflow,有没有类似的numpy.take? 我想从N-维数组中形成N+1-维数组,更精确地说,从具有形状的数组中形成(B,H,W,C)我想制作(B,H,W,X,C)数组 我想对于我的情况,即使没有这样的一般操作,也有解决办法。但我真的不确定,如果我编写带有多个中间操作和张量(移位、重复等)的代码,TF是否能够对其进行优化并删除不必要的操作。此外,我认为这样的代码将是不干净的,只是可怕的 我想添加带有移位值的维度。即,对于(H,W)->(H,W,3)维度,案例索引必须为 [ [[0,0], #[0,-1]

有没有类似的
numpy.take
? 我想从
N
-维数组中形成
N+1
-维数组,更精确地说,从具有形状的数组中形成
(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(分散),但现在我不知道如何使用它。如果我理解正确,我不能将
索引
用于大于
更新
数组的形状(即,我不能将
索引
用于形状
(3,4,5,3)
更新
用于形状
(3,4,3)
甚至
(3,4,1,3)
。如果是这样的话,那么这个操作似乎毫无用处,除非我用我需要在结果中形成的形状制作中间数组

UPD:可能是我错了,张量运算(移位、平铺等)是更合适、更有效的解决方案。
但在任何情况下,我认为对
np.take
的模拟都是有用的。

tensorflow中与
np.take
最接近的函数是and

tf.gather\nd
tf.gather
(和
np.take
)更一般,因为它可以一次分割多个维度


np.take
相比,
tf.gather[\u nd]
的一个明显限制是,它们只对张量的第一个维度进行切片,而不能对内部维度进行切片。当您想要对任意维度进行切片时(如您的情况),您需要对数组进行转置,以首先放置切片维度,然后进行聚集,然后将其转置回原处。

tensorflow中最接近的函数是
np。take
是and

tf.gather\nd
tf.gather
(和
np.take
)更一般,因为它可以一次分割多个维度


np.take
相比,
tf.gather[\u nd]
的一个明显限制是,它们只对张量的第一个维度进行切片,而不能对内部维度进行切片。当您想要对任意维度进行切片时(如您的情况),您需要转置数组以首先放置切片维度,然后聚集,然后再转置回去。

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()))

tf.collect
替换
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()))

谢谢!我不确定我是否理解关于切片的声明。我只是构建了没有切片的完整索引(使用numpy)并使用此索引收集数据。看起来它有效,至少TF没有错误。我将尝试测试它。谢谢,@P-Gn,我遇到了相同的问题。并且找不到任何解决方案来通过内部维度索引分割teensor。到目前为止,转置似乎是唯一的解决方案。谢谢!我不确定我是否理解关于切片。我只构建没有切片的完整索引(使用numpy)并使用此索引收集数据。似乎它有效,至少TF没有错误。我将尝试测试它。谢谢,@P-Gn,我遇到了相同的问题。并且找不到任何解决方案来通过内部维度索引分割teensor。转置似乎是目前为止唯一的解决方案。我不理解你的
np。进行
类比。它只是沿着一个维度建立索引,可以选择包装或剪裁。我不理解你的
np。打个比方吧
。它只是沿着一个维度建立索引,可以选择包装或剪裁。