NumPy 数组在 assignment/copy 时失去维度,为什么?

NumPy array loses dimension upon assignment/copy, why?

我有以下代码:

print(type(a1), a1.shape)
a2 = a1                  #.reshape(-1,1,2) this solves my problem
print(type(a2), a2.shape)

输出为:

<class 'numpy.ndarray'> (8, 1, 2)
<class 'numpy.ndarray'> (8, 2)

我知道(注释掉的)reshape 解决了我的问题,但是,我想了解为什么一个简单的赋值会导致丢失数组的中心维度。

有人知道这是怎么回事吗?为什么引用另一个名称的数组会改变其维度?

我不确定你为什么得到 this.but 它不应该 return 像 this.Can 你请分享你的 a1 是如何创建的。

我试过如下但无法重新创建它

a1=np.ones((8,1,2),dtype=np.uint8)
print(type(a1), a1.shape)

<class 'numpy.ndarray'> (8, 1, 2)

a2=a1

print(type(a2), a2.shape)

<class 'numpy.ndarray'> (8, 1, 2)`

查看评论中提到的 openCV script,有必要对三个维度进行整形,因为通过布尔索引正在丢失一个维度,而不是单独通过赋值。

引发该问题的脚本中数组的名称是 p0good_new

下面是该脚本中操作的细分:

  1. p0 是一个 3D 数组,形状为 (17, 1, 2).

  2. 行:

    p1, st, err = cv.calcOpticalFlowPyrLK(old_gray, frame_gray, p0, None, **lk_params)
    

    创建新数组,数组 p1 的形状为 (17, 1, 2),数组 st 的形状为 (17, 1)

  3. 赋值good_new = p1[st==1]通过对p1的布尔索引操作创建了一个新的数组对象。这是一个二维数组,形状为 (17, 2)。通过索引操作丢失了一个维度。

  4. 名称p0需要赋回good_new中包含的数组数据,但是p0也需要是3D的。为此,脚本使用 p0 = good_new.reshape(-1, 1, 2).


为了完整起见,总结一下步骤(3)中的布尔索引操作导致维度消失的原因。

布尔数组 st == 1 的形状 (17, 1)p1(17, 1, 2).

的初始维度匹配

这意味着选择发生在 p1 的第二个维度:索引器数组 st == 1 正在确定结果数组中应包含哪些形状为 (2,) 的数组。最终数组的形状为 (n, 2),其中 n 是布尔数组中 True 个值的数量。

此行为在 NumPy 文档中有详细说明 here