这是我在这里的第一个问题,它是关于在Python中使用numpy库的。我有一个函数,它可以获得带有x,y坐标的三维numpy数组(np.array)。该函数的逻辑-将该数组从较小的坐标重新排序为较大的坐标
import numpy as np
def reorder(points):
# reshaping array
points = points.reshape((4, 2))
# creating empty output array
points_new = np.zeros((4, 1, 2), np.uint8)
# summing the values
add = points.sum(1)
# find difference
diff = np.diff(points, axis=1)
# with the smaller sum will be first, the maximum will be last
points_new[0] = points[np.argmin(add)]
points_new[3] = points[np.argmax(add)]
# the smaller difference will be the second, the max difference - the third
points_new[1] = points[np.argmin(diff)]
points_new[2] = points[np.argmax(diff)]
return points_new
字符串
但是使用这个功能之后
input_data = np.array([[[ 573, 148]], [[ 25, 223]], [[ 153, 1023]], [[ 730, 863]]])
output_data = reorder(data)
型
我得到了奇怪的结果
np.array([[[ 25, 223]], [[ 61, 148]], [[153, 255]], [[218, 95]]])
型
如您所见,在新数组output
* data
中,数据已更改,但应包含与input
* data
相同的值
我用简单列表重写了这个函数
def reorder_by_lst(points):
# reshaping array
points = points.reshape((4, 2))
# summing the values
add = points.sum(1)
# find difference
diff = np.diff(points, axis=1)
# with the smaller sum will be first, the maximum will be last
a = points[np.argmin(add)]
d = points[np.argmax(add)]
# the smaller difference will be the second, the max difference - the third
b = points[np.argmin(diff)]
c = points[np.argmax(diff)]
lst = [a, b, c, d]
return np.array(lst)
型
用过之后
input_data = np.array([[[ 573, 148]], [[ 25, 223]], [[ 153, 1023]], [[ 730, 863]]])
output_data = reorder_by_lst(data)
型
我得到了这个结果
np.array([[ 25, 223], [ 730, 863], [ 573, 148], [ 153, 1023]])
型
现在的结果是一样的,只有维度应该是固定的。这似乎是一个错误,但也许这是深功能,我不知道。我需要一个专业社区的意见。
P.S. Python版本- 3.10,Numpy版本- 1.23.5
1条答案
按热度按时间rdlzhqv91#
将
points_new
数组设置为np.unint8
类型,这是一个无符号的8位整数。因此,值的范围是0到255,可以如下检查:字符串
你的
points
数组的值超过了255,所以它们溢出并折回。这就是为什么你会得到“新数据”。你可以通过将points
数组也转换为np.uint8
来检查它实际上在处理什么。型
你的列表版本工作的原因是因为你从来没有将返回数组设置为
np.uint8
类型,所以它默认为np.int32
。