python 新的numpy np.array从旧的np.array中分配了错误的数据,期望值是相同的

t98cgbkg  于 12个月前  发布在  Python
关注(0)|答案(1)|浏览(80)

这是我在这里的第一个问题,它是关于在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

rdlzhqv9

rdlzhqv91#

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

相关问题