这是我的第一个问题,是关于在 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]])
现在结果是一样的,只是尺寸应该固定。 这看起来像是一个错误,但也许这是我不知道的深层功能。我需要专业社区的评论。
附注Python 版本 - 3.10,Numpy 版本 - 1.23.5
您将
points_new
数组设置为 np.unint8
类型,这是一个无符号 8 位整数。因此,值的范围是 0 到 255,可以按如下方式检查:
>>> np.iinfo(np.uint8)
iinfo(min=0, max=255, dtype=uint8)
您的
points
数组的值超过 255,因此它们会溢出并回绕。这就是您获得“新数据”的原因。您也可以通过将 points
数组强制转换为 np.uint8
来检查它实际使用的内容。
>>> np.array([[[573, 148]],
[[25, 223]],
[[153, 1023]],
[[730, 863]]],
dtype=np.uint8)
array([[[ 61, 148]],
[[ 25, 223]],
[[153, 255]],
[[218, 95]]], dtype=uint8)
您的列表版本起作用的原因是因为您从未将返回数组设置为
np.uint8
类型,因此它默认为np.int32
。