arrays - NumPy 数组在赋值/复制时丢失维度,为什么?

标签 arrays python-3.x numpy dimensions

我有以下代码:

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 解决了我的问题,但是,我想了解为什么简单的赋值会导致失去数组的中心维度。

有人知道发生了什么吗?为什么用另一个名字引用数组会改变它的维度?

最佳答案

看着openCV script在评论中提到, reshape 为三个维度是必要的,因为维度是通过 bool 索引而丢失的,而不仅仅是分配。

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

以下是该脚本中操作的分割:

  • p0是形状为 (17, 1, 2) 的 3D 阵列.
  • 线路:
    p1, st, err = cv.calcOpticalFlowPyrLK(old_gray, frame_gray, p0, None, **lk_params)
    

    创建新数组,数组 p1有形状(17, 1, 2)和数组 st有形状(17, 1) .
  • 任务 good_new = p1[st==1]通过对 p1 的 bool 索引操作创建一个新数组对象.这是一个二维数组,形状为 (17, 2) .通过索引操作丢失了一个维度。
  • 姓名 p0需要重新赋值给 good_new 中包含的数组数据,但是 p0还需要是3D的。为此,脚本使用 p0 = good_new.reshape(-1, 1, 2) .


  • 为了完整起见,值得总结一下为什么步骤(3)中的 bool 索引操作会导致维度消失。

    bool 数组 st == 1有形状(17, 1)匹配 p1 的初始尺寸, (17, 1, 2) .

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

    NumPy 文档 here 中详细介绍了此行为。 .

    关于arrays - NumPy 数组在赋值/复制时丢失维度,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59118536/

    相关文章:

    arrays - 确定2个对应集合的类型

    excel - Excel 中的 Python 输出

    python - 来自 Python 中的 Numpy 数组的 Canvas 上的多边形 (QML)

    numpy - f numpy 数组的字符串格式

    arrays - 子数组长度 > 0 的最小和

    php - 将文本转换为关键字数组

    r - 使用首先处理的年份创建新变量

    python - distutils `Command` 应该如何返回非零退出代码?

    python - 如何使用 numpy 和 strides 来提高循环性能

    C 字符串数组