新的 numpy np.array 从旧的 np.array 中分配了错误的数据,预计值将相同

问题描述 投票:0回答:1

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

python numpy numpy-ndarray
1个回答
1
投票

您将

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

© www.soinside.com 2019 - 2024. All rights reserved.