pytorch张量中的过滤行

pytorch张量中的过滤行,pytorch,Pytorch,如果我有张量,它以以下形状保存检测图像的信息: [[595.00000, 179.62500, 628.00000, 283.00000, 0.89062, 0.00000], [142.87500, 167.62500, 201.62500, 324.00000, 0.88086, 0.00000], [311.75000, 170.50000, 368.75000, 320.50000, 0.87549, 0.00000

如果我有张量,它以以下形状保存检测图像的信息:

        [[595.00000, 179.62500, 628.00000, 283.00000,   0.89062,   0.00000],
        [142.87500, 167.62500, 201.62500, 324.00000,   0.88086,   0.00000],
        [311.75000, 170.50000, 368.75000, 320.50000,   0.87549,   0.00000],
        [555.50000, 173.75000, 593.50000, 280.50000,   0.85791,   0.00000],
        [398.50000, 179.00000, 425.50000, 265.00000,   0.84180,   0.00000],
        [445.75000, 177.75000, 479.25000, 270.75000,   0.82129,   0.00000]]
其中,每行表示具有以下参数的图像:

[   top,    bottom, left,   right, confidence, class    ]
对于尺寸小于某些用户定义的高度输入(即
上下
)的图像(行),最有效的放置方法是什么

当然,我会对行进行迭代,然后在
上下
的位置删除每一行,并对列表进行一些理解,但我怀疑有更好的方法来做到这一点。

解决方案是:

import torch
a = torch.Tensor(
     [[595.00000, 179.62500, 628.00000, 283.00000,   0.89062,   0.00000],
        [142.87500, 167.62500, 201.62500, 324.00000,   0.88086,   0.00000],
        [311.75000, 170.50000, 368.75000, 320.50000,   0.87549,   0.00000],
        [555.50000, 173.75000, 593.50000, 280.50000,   0.85791,   0.00000],
        [398.50000, 179.00000, 425.50000, 265.00000,   0.84180,   0.00000],
        [445.75000, 177.75000, 479.25000, 270.75000,   0.82129,   0.00000]])

y = a[a[:, 0] - a[:, 1] > 300]

print(y)

> tensor([[595.0000, 179.6250, 628.0000, 283.0000,   0.8906,   0.0000],
>         [555.5000, 173.7500, 593.5000, 280.5000,   0.8579,   0.0000]])

例如,如果您只需要保留高度>300px的图像,我可以删除一些基准点吗(如果您感兴趣的话)

基准

PYIC方式:

In[2]: import torch
  ...: a = torch.Tensor(
  ...:      [[595.00000, 179.62500, 628.00000, 283.00000,   0.89062,   0.00000],
  ...:         [142.87500, 167.62500, 201.62500, 324.00000,   0.88086,   0.00000],
  ...:         [311.75000, 170.50000, 368.75000, 320.50000,   0.87549,   0.00000],
  ...:         [555.50000, 173.75000, 593.50000, 280.50000,   0.85791,   0.00000],
  ...:         [398.50000, 179.00000, 425.50000, 265.00000,   0.84180,   0.00000],
  ...:         [445.75000, 177.75000, 479.25000, 270.75000,   0.82129,   0.00000]])
In[3]: %timeit a[a[:, 0] - a[:, 1] > 300]
Out[3]: 24.5 µs ± 904 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
用Numpy的话来说:

In[4]: import numpy as np
In[5]: %timeit np_arr[np.where(np_arr[:, 0] - np_arr[:, 1] > 300)]
Out[5]: 4.75 µs ± 713 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In[6]: np_arr[np.where(np_arr[:, 0] - np_arr[:, 1] > 300)]
衡平法

In[7]: torch.equal(torch.from_numpy(np_arr[np.where(np_arr[:, 0] - np_arr[:, 1] > 300)]), a[a[:, 0] - a[:, 1] > 300])
Out[7]: True
结论是使用numpy进行比较要比PyTorch快得多