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

Arrays NumPy数组在赋值/复制时丢失维度,为什么?,arrays,python-3.x,numpy,dimensions,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) (8,1,2) (8, 2) 我知道(注释掉的)重塑解决了我的问题,但是,我想

我有以下代码:

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)
(8,1,2)
(8, 2)
我知道(注释掉的)重塑解决了我的问题,但是,我想理解为什么一个简单的赋值会导致失去数组的中心维


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

我不确定您为什么会得到这个结果。但它不应该像这样返回。请您分享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)`
a1=np.one((8,1,2),dtype=np.uint8)
印刷品(类型(a1),a1.形状)
(8, 1, 2)
a2=a1
打印(类型(a2),a2.形状)
(8, 1, 2)`
查看注释中提到的,有必要对三维进行重塑,因为一个维度是通过布尔索引丢失的,而不仅仅是赋值丢失的

该脚本中引发问题的数组的名称是
p0
good\u 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\u new=p1[st==1]
    通过对
    p1
    执行布尔索引操作来创建一个新的数组对象。这是一个二维数组,其形状
    (17,2)
    。索引操作中丢失了一个维度

  • 名称
    p0
    需要分配回
    good\u new
    中包含的数组数据,但是
    p0
    也需要是3D。为了实现这一点,脚本使用
    p0=good\u new.reformate(-1,1,2)


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

    布尔数组
    st==1
    具有形状
    (17,1)
    ,该形状与
    p1
    (17,1,2)
    的初始尺寸相匹配

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


    NumPy文档中详细介绍了这种行为。

    Hi Ajit。您可以在此处看到代码:。注意代码中的最后一行。Cheers我无法断定赋值
    a2=a1
    会以任何方式更改基础NumPy数组对象。请您发布完整的代码来重现您看到的问题以及您正在使用的任何库的版本,好吗?(我已经看到了您在Ajit答案下方留下的opencv链接,但我无法准确地推断此代码与此问题中的问题的关系。)请注意代码第61行的重塑:。如果没有这种重塑,
    p0
    将不会有与
    good\u new
    相同的维度,也就是说,它将失去“中心”维度。是的,我注意到了这种重塑,但这段代码中发生的事情远不止简单的赋值或复制。NumPy数组不会因为赋值或通过其
    copy()
    方法而丢失维度,仅由于特定的索引操作、显式重塑、轴上的缩减等。在链接中,
    good\u new
    被指定给索引
    p1
    的结果,该结果是
    cv.calcOpticalFlowPyrLK(…,p0,…)的输出
    ,因此如果必须对
    好的_新的
    进行重塑以引入额外维度,我并不感到惊讶。我认为你的问题的前提不正确,所以我不确定如何回答。
    good\u new
    有中心维度,请打印出来<如果删除作业上的
    重塑
    语句,code>p0将丢失它。我也对此感到惊讶,然而,它正在发生。干杯,好吧,我想我明白了:当我运行脚本时,
    good\u new
    具有shape
    (17,2)
    。这看起来是因为
    p0
    p1
    都有形状
    (17,1,2)
    st
    有形状
    (17,1)
    ,脚本设置
    good\u new=p1[st==1]
    (第43行)。由于布尔索引(即
    p1[st==1]
    ),中心维度从
    p1
    中删除,然后将此二维数组分配给
    good\u new
    变量。这就是为什么在重新分配回名称
    p0
    (必须是3D)之前必须对新的
    进行重塑的原因。因此,由于索引而不是赋值/复制,维度丢失。