【发布时间】:2019-11-30 17:26:23
【问题描述】:
我有以下代码:
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)
我知道(已注释掉的)重塑解决了我的问题,但是,我想了解为什么简单的赋值会导致数组的中心维度丢失。
有人知道发生了什么吗?为什么用另一个名字引用数组会改变它的尺寸?
【问题讨论】:
-
我无法想象赋值
a2 = a1会改变底层 NumPy 数组对象。请您发布完整的代码以重现您所看到的问题以及您正在使用的任何库的版本吗? (我已经看到您在 Ajit 的答案下方留下的 opencv 链接,但我无法准确推断出这段代码与这个问题中的问题有何关系。) -
请注意代码中第 61 行的重塑:github.com/opencv/opencv/blob/master/samples/python/…。如果没有这种重塑,
p0将不会具有与good_new相同的维度,即它将失去“中心”维度。 -
是的,我注意到了 reshape,但代码中的内容远不止简单的赋值或复制。 NumPy 数组不会由于分配或通过其
copy()方法而丢失维度,仅由于特定的索引操作、显式整形、轴上的缩减等。在您的链接中,good_new被分配给索引@的结果987654329@ 是cv.calcOpticalFlowPyrLK(..., p0, ...)的输出,所以如果good_new必须重新整形以引入额外的维度,我并不感到惊讶。我不认为你的问题的前提是正确的,所以我不确定如何回答。 -
good_new具有中心尺寸,只需打印即可。如果您删除分配上的reshape语句,p0将丢失它。我也对此感到惊讶,但是,它正在发生。干杯, -
好吧,我想我明白了:当我运行脚本时,
good_new的形状为(17, 2)。这看起来是因为p0和p1都具有形状(17, 1, 2)和st具有形状(17, 1)并且脚本设置了good_new = p1[st==1](第 43 行)。由于布尔索引(即p1[st==1]),中心维度从p1中删除,然后将此二维数组分配给good_new变量。这就是为什么good_new必须在重新分配回名称p0(必须是3D)之前重新整形。所以维度是由于索引而不是分配/复制而丢失的。
标签: arrays python-3.x numpy dimensions