在python/numpy中,如何将包含条目[[[int]]…]的向量转换为包含条目[[int]…]的向量?

2024-09-25 10:34:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我在一个numpy向量中有这样的数据:

 [[[1119   15]]

 [[1125   27]]

 [[1129   43]]

 [[1131   62]]

 [[1131   87]]

 [[1141  234]]

 ...]

这些应该是一组我可以用来表示曲线的点,但是每个点[int,int]似乎被封装在另一个向量中。例如:我有[[11]]而不是[11]。你知道吗

这个数据是由opencv函数cv2.approxPolyDP在我给它一个“轮廓”之后给我的,我需要处理它。我认为这个函数基本上给了我它认为是一组曲线的东西,但是这里每条曲线只包含一个点[int],这是没有意义的。只有一个点的曲线不是曲线,而是一个点。你知道吗

在这种情况下有没有办法把[[int]]转换成[int]呢?你知道吗


Tags: 数据函数numpy情况cv2向量opencv曲线
3条回答

可能这不是最佳解决方案,但您可以这样做:

import numpy as np

# example 

a = np.array( [ [[1119, 15]], [[1125, 27]], [[1129, 43]] ] )

# convert

a = np.array( [ x[0] for x in a ] )

print a

[[1119   15]
 [1125   27]
 [1129   43]]

编辑:

import numpy as np

a = np.array( [ [[1119, 15]], [[1125, 27]], [[1129, 143]] ] )

size = len(a)

a = a.reshape([size,2])

print a

    [[1119   15]
     [1125   27]
     [1129   43]]

看看这个阵列的形状。可能是(n, 1, 2)。你知道吗

reshape将其转换为(n,2)x.reshape(-1,2)是一个方便的快捷方式,省去了确定n的工作。squeezegit也去掉了奇异维。你知道吗

您可以检查approxPolyDP中的第二个参数是否太大。 请注意,以下代码并不总是使其变小:

epsilon = 0.1*arcLength(contour,True)
polygon = approxPolyDP(contour, epsilon, True)

当轮廓边缘有噪声时,arcLength返回的轮廓弧长可能非常非常大,乘以0.1后会产生一个非常大的epsilon,从而使approxPolyDP将整个轮廓简化为一个点。你知道吗

相关问题 更多 >