我有以下代码:
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 索引而丢失的,而不仅仅是分配。
该脚本中引发问题的数组名称是 p0
和 good_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)
, 其中 n
是True
的数量 bool 数组中的值。NumPy 文档 here 中详细介绍了此行为。 .
关于arrays - NumPy 数组在赋值/复制时丢失维度,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59118536/