当前位置: 首页 > 知识库问答 >
问题:

如何在高阶张量中找到第一匹配张量的索引

骆嘉石
2023-03-14

非常类似于这个问题,如何在TensorFlow中找到第一个匹配元素的索引

我试着解决这个问题,但不同的是,val不是一个单一的数字,而是一个张量

所以例子

np.array([1, 1, 1],
         [1, 0, 1],
         [0, 0, 1])
val = np.array([1, 0, 1])


some tensorflow magic happens here!

result = 1

我知道我可以使用一个while循环,但这看起来很混乱。我可以尝试一个映射函数,但是有更优雅的吗?

共有1个答案

古文康
2023-03-14

有一个办法-

(arr == val).all(axis=-1).argmax()

样品运行-

In [977]: arr
Out[977]: 
array([[1, 1, 1],
       [1, 0, 1],
       [0, 0, 1]])

In [978]: val
Out[978]: array([1, 0, 1])

In [979]: (arr == val).all(axis=1).argmax()
Out[979]: 1

使用视图可能会更有效-

# https://stackoverflow.com/a/44999009/ @Divakar
def view1D(a): # a is array
    a = np.ascontiguousarray(a)
    void_dt = np.dtype((np.void, a.dtype.itemsize * a.shape[1]))
    return a.view(void_dt).ravel()

out = (view1D(arr) == view1D(val[None])).argmax()

n-dim情形的推广

扩展到n-dim阵列情况将需要更多的步骤-

def first_match_index_along_axis(arr, val, axis):    
    s = [None]*arr.ndim
    s[axis] = Ellipsis
    mask = val[np.s_[s]] == arr
    idx = mask.all(axis=axis,keepdims=True).argmax()
    shp = list(arr.shape)
    del shp[axis]
    return np.unravel_index(idx, shp)

样本运行-

In [74]: arr = np.random.randint(0,9,(4,5,6,7))

In [75]: first_match_index_along_axis(arr, arr[2,:,1,0], axis=1)
Out[75]: (2, 1, 0)

In [76]: first_match_index_along_axis(arr, arr[2,1,3,:], axis=3)
Out[76]: (2, 1, 3)
 类似资料:
  • 分配张量时如何解决ResourceExhaustedError: OOM的问题? ResourceExhaustedError(回溯见上文):使用形状分配张量时OOM[10000,32,28,28] 我包含了几乎所有的代码 错误中引用的行是: 快跑。。在训练循环中 下面列出了我从调试器输出复制的更多错误(有更多行,但我认为这些是主要错误,其他错误是由此引起的…) tensorflow.python

  • 我试图在张量流图中使用条件随机场损失。 我正在执行序列标记任务: 我有一系列元素作为输入。每个元素可以属于三个不同类中的一个。类以一种热编码方式表示:属于类0的元素由向量[表示。 我的输入标签(y)有大小(xx)。 我的网络产生相同形状的日志。 假设我所有的序列都有长度4。 这是我的代码: 我得到以下错误: 文件“/usr/local/lib/python2.7/dist-packages/ten

  • 问题内容: 由于我需要在使用Tensorflow训练模型之前为数据编写一些预处理程序,因此需要对进行一些修改。但是,我不知道如何像使用一样修改值。 最好的方法是可以直接修改。但是,在当前版本的Tensorflow中似乎不可能。另一种方法是改变到该进程,然后用改回来。 关键是如何更改为。 1):https : //www.tensorflow.org/versions/r0.8/api_docs/p

  • TensorFlow用张量这种数据结构来表示所有的数据.你可以把一个张量想象成一个n维的数组或列表.一个张量有一个静态类型和动态类型的维数.张量可以在图中的节点之间流通. 阶 在TensorFlow系统中,张量的维数来被描述为阶.但是张量的阶和矩阵的阶并不是同一个概念.张量的阶(有时是关于如顺序或度数或者是n维)是张量维数的一个数量描述.比如,下面的张量(使用Python中list定义的)就是2阶

  • 我制作了自己的AlexNet实现,其中少了一个完全连接的层,用于对102类花卉进行分类。我的培训集由11000个图像组成,而验证和培训集各有3000个图像。我以HDF5格式编写了这三个数据集,并将它们存储在磁盘上。我重新加载了它们,并尝试使用8和75个纪元的批次通过网络传递图像。但是,出现了内存错误 我已经尝试将批量大小减少到8,并将尺寸减少到400x400(原来是500x500),但没有用 te

  • 矩阵和标量可用几种不同方法合并。例如,通过从矩阵中每元素减去同一个数,矩阵就减去了一个标量。我们的魔方中元素的平均值是8.5,因此 B = A - 8.5 组成一个列向量和为零的矩阵。 B = 7.5 -5.5 -6.5 4.5 -3.5 1.5 2.5 -0.5 0.5 -2.5 -1.5