【问题标题】:How to find index of first matching tensor in a higher ranked tensor如何在排名较高的张量中找到第一个匹配张量的索引
【发布时间】:2023-04-11 02:46:02
【问题描述】:

与这个问题非常相似 How to find an index of the first matching element in 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 循环,但这看起来很乱。 我可以尝试映射函数,但有什么更优雅的吗?

【问题讨论】:

  • 你总是在二维张量中寻找一维张量吗?还是需要泛化到nD?
  • 在 2D 中总是 1D,但一般化也不错
  • 发布的解决方案对您有用吗?如果有,请考虑接受。
  • 不,我最终没有一个高效的解决方案。
  • 哦,对不起,我的意思是说我尝试过的解决方案是被接受的。但它最终对我的目标来说非常缓慢,所以我最终完全放弃了这种方法

标签: python numpy machine-learning tensorflow


【解决方案1】:

这是一种方法-

(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

views 可能会更高效 -

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

【讨论】:

  • 或使用 TensorFlow,Numpy 单线将是 tf.argmax(tf.cast(tf.reduce_all(tf.equal(arr, val), axis=1), tf.int32))(解决 == 未重载、.all 未实现且 argmax 不适用于布尔值的事实)。请注意,这两个版本都有些危险,因为如果从未找到该模式,它们将返回 0。
  • @AllenLavoie 如果找不到,我们可以使用:np.where,正如这里所讨论的 - stackoverflow.com/questions/47269390/…
猜你喜欢
  • 2019-07-15
  • 1970-01-01
  • 2021-12-30
  • 1970-01-01
  • 2020-09-23
  • 1970-01-01
  • 2018-07-02
  • 1970-01-01
  • 2022-01-21
相关资源
最近更新 更多