【问题标题】:Finding the difference between two values in a numpy array-with code用代码查找 numpy 数组中两个值之间的差异
【发布时间】:2019-09-04 10:00:05
【问题描述】:

我有一个 numpy 列表,由 (my_array=[] 启动,形状为 (0,)) 然后我将 wm 和 hm 元素附加到它上面,就像这样(r 是一个级联,格式为-[ [300 240 22 22]]):

my_array=[]
for (x, y, w, h) in r:
    wm=int(x+ (w/2.))
    hm=int(y+ (h/2.))
    my_array.append([numpy.float32(wm), numpy.float32(hm)])
return numpy.array(my_array)

该代码产生: wm 元素 hm 元素 [[270.01 303.43] [310.17 306.37]] #倒数第二行 [[269.82 303.38] [310.99 306.86]] #最后一行 返回数组的形状是 (2,2) 并且是 dtype:float32

现在的问题是,当我尝试附加 303.43 时,理论上它会是 [-2][1],但它索引 303.38。这很好,但我还需要索引 303.43。

我发现第一个 [] 索引 wm[0] 或 hm[1] 元素,然后第二个 [] 索引每个元素内的两列值之一

-例如 [0][-1] 索引 wm 元素 [0] 和最后一行 [-1] 我也想索引倒数第二行并尝试了 [0][-2] 但它没有没有按预期工作(它索引了 269.82)。

所以我尝试了 [0][1][-2] 但由于 IndexError: invalid index to scalar variable 没有工作。

我要做的就是找到 wm 元素中 2 列的最后一行和倒数第二行之间的差异(因此在上面的示例中,它将是 269.82-270.1=-0.19 和 303.38-303.43=- 0.05)。其他问题中提出的所有解决方案都不起作用([0][-1],[-1][0],您可以自己尝试找出)索引不起作用。那么有没有办法解决这个问题?请充分解释一下,因为我对此还是有点陌生​​!提前致谢!

补充: 取最后两个数据块
索引数组(在空闲时)获取(我复制了数组的最后两个块):
[[293.51373 323.4329 ] [247.77493 316.02783]]

[[292.9887  322.23425]
 [247.24142 314.2921 ]]

在我的程序中,它显示为(相同的数组)
--wm 元素-----------------hm 元素
[[293.51373 323.4329 ][247.77493 316.02783]] 我认为这是倒数第二行
[[292.9887 322.23425][247.24142 314.2921 ]] 我认为这是最后一行

这给我带来了很多困惑,但直到现在我都忽略了它们显示方式的细微差别。现在,问题是如何索引 323.4329 和 293.51373 数字,如果可以单独索引它们会更好吗?

【问题讨论】:

  • arr[-1, 0] 是最后一行,第一列,wmarr[-2,1] 是倒数第二行,第二列,hm
  • 你试过代码了吗?arr[-2,1] 显示为第二列,大概 wm 和 arr[-1,0] 的最后一行是第一列和最后一行嗯,这是什么令人困惑。出于这个原因,我需要帮助,甚至提供了代码,以便人们自己尝试并发现这个奇怪的异常。我尝试了 [x,y] 的每个索引组合,它要么给出轴为 1 的错误,要么索引不同的东西。这就是为什么我需要有人帮忙。如前所述,上述或之前提出的所有索引方法都不适用于倒数第二行的索引。
  • 可能是轴为 1,所以我无法索引倒数第二行。附加元素不会添加新行,它只会更新当前值。所以,我尝试了不同的方法,但没有奏效。现在我在这里尝试看看如何使用不同的附加方法或索引方法来做到这一点。
  • 你的数组是二维的,wm 值在第一列,hm 值在第二列。 arr[:0] 获取所有 wm 值。 arr[-1,:] 获取最后附加的 (wm,hm) 对。

标签: python arrays numpy opencv indexing


【解决方案1】:

一个样本r

In [41]: r = np.array([[0,0,8,10],[1,1,6,8],[2,2,10,12]])                            
In [42]: r                                                                           
Out[42]: 
array([[ 0,  0,  8, 10],
       [ 1,  1,  6,  8],
       [ 2,  2, 10, 12]])

In [43]: my_array=[]                                                                 
In [45]: for (ex,ey,ew,eh) in r: 
    ...:     wm = int(ex+(ew/2)) 
    ...:     hm = int(ey+(eh/2)) 
    ...:     print(wm,hm) 
    ...:     my_array.append([wm,hm]) 
    ...:                                                                             
4 5
4 5
7 8

结果数组:

In [46]: arr = np.array(my_array)                                                    
In [47]: arr                                                                         
Out[47]: 
array([[4, 5],
       [4, 5],
       [7, 8]])

示例索引:

In [48]: arr[:,0]                                                                    
Out[48]: array([4, 4, 7])   # the 3 wm values
In [49]: arr[-1,:]          # the last values produced by the last `r` row                                                         
Out[49]: array([7, 8])

或者更符号化的数组:

In [52]: arr = np.array([[f'wm{i}',f'hm{i}'] for i in range(3)])                     
In [53]: arr                                                                         
Out[53]: 
array([['wm0', 'hm0'],
       ['wm1', 'hm1'],
       ['wm2', 'hm2']], dtype='<U3')
In [54]: arr[:,0]                                                                    
Out[54]: array(['wm0', 'wm1', 'wm2'], dtype='<U3')
In [55]: arr[-1,:]                                                                   
Out[55]: array(['wm2', 'hm2'], dtype='<U3')

===

In [108]: arr = np.array([[313.5536, 330.60587], [368.23245, 332.70932]])            
In [109]: arr                                                                        
Out[109]: 
array([[313.5536 , 330.60587],      # 2nd to the last row
       [368.23245, 332.70932]])     # last row

最后一行:

In [110]: arr[-1]                                                                         
Out[110]: array([368.23245, 332.70932])
In [111]: arr[-1,:]                                                                  
Out[111]: array([368.23245, 332.70932])

第一列

In [112]: arr[:,0]                                                                   
Out[112]: array([313.5536 , 368.23245])

倒数第二行:

In [113]: arr[-2,:]                                                                  
Out[113]: array([313.5536 , 330.60587])

【讨论】:

  • arr- [[313.5536 330.60587] [368.23245 332.70932]] arr[-1] -[368.23245 332.70932] arr[:,0]- [313.5536 368.23245] arr[-1,:] -[[368.23245 332.70932]] 这些是直接从代码中获取的结果,因此它可以帮助您更好地了解正在发生的事情。希望这会有所帮助,如果有帮助,我可以向您展示其他索引方法以及它们产生的结果!
  • 将您的值复制到我的答案中。将第 2 行索引到最后一行,即在这种 2 行情况下的第一行,对我来说非常明显。
  • 好吧,如果就这么简单,我就不会寻求帮助了。但也许我看错了。在程序上,它把数组显示为一条直线,所以我认为索引使用的是直线索引。因此,如果我们有几个连续的行,那么我可以对它们进行索引,就好像它们在一条直线上一样,从而与索引方法获取的“奇怪索引”混淆。但是在空闲程序上,它显示为 2 行数组(而不是单行),我认为这就是它的显示方式。如果是这种情况,那么抱歉让您感到困惑。谢谢你一直陪着我!
  • It shows?你的意思是在情节或图像中?您提供的数组可能会为框或类似的东西定义一些角点,但索引数组只会给出这些点,而不是框内或框内的线。您必须使用某种图像或绘图代码来沿一条线插入点。
  • 我可能看错了。带有一些索引的情况似乎确实如此。但我的问题仍然存在。只是以不同的方式。现在我可以更好更正确地解释它了。除了问题,我还会这样做,以便我可以正确格式化所有内容
猜你喜欢
  • 1970-01-01
  • 2020-01-11
  • 1970-01-01
  • 1970-01-01
  • 2018-01-07
  • 2019-01-20
  • 1970-01-01
  • 2016-07-21
  • 2015-10-08
相关资源
最近更新 更多