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,有必要对三个维度进行整形,因为通过布尔索引正在丢失一个维度,而不是单独通过赋值。
引发该问题的脚本中数组的名称是 p0
和 good_new
。
下面是该脚本中操作的细分:
p0
是一个 3D 数组,形状为 (17, 1, 2)
.
行:
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
的布尔索引操作创建了一个新的数组对象。这是一个二维数组,形状为 (17, 2)
。通过索引操作丢失了一个维度。
名称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。
我有以下代码:
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,有必要对三个维度进行整形,因为通过布尔索引正在丢失一个维度,而不是单独通过赋值。
引发该问题的脚本中数组的名称是 p0
和 good_new
。
下面是该脚本中操作的细分:
p0
是一个 3D 数组,形状为(17, 1, 2)
.行:
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
的布尔索引操作创建了一个新的数组对象。这是一个二维数组,形状为(17, 2)
。通过索引操作丢失了一个维度。名称
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。