Numpy vectorvector与数组sli相乘

2024-05-16 11:07:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我有个简单的问题。我看过的大量教程都显示了除了这种常见情况之外的所有内容。我想做一个逐元素向量乘,其中一个向量是矩阵的一个切片。你知道吗

我不能用shell交互地复制这个问题,所以我不理解它。下面是说明问题的部分代码。你知道吗

    Ordr = 2  # these values set higher up in the code
    nx = 5
    dx = np.empty((Ordr-1,nx),dtype=float)
    # vector dpx and dx calculated in other code here
    print('shapes dpx,dx',dpx.shape,dx.shape)
    ap.arrayprint('root calc:',dpx,np.transpose(dx)) # not shown originally
    dtmp = dpx*dx[0,:]
    print('shape dtmp',dtmp.shape)
results are:
  shapes dpx,dx (5,) (1, 5)
  shape dtmp (5,5)

我希望dtmp是形状(5,) 虽然我还没有检查实际的数字,但似乎正在计算一个外积。如果我颠倒顺序,也就是dpx[0,:]*dx,没有什么区别 正如我所说,我还不能在shell中复制这个问题,所以我想知道是什么给了我答案。我在Cygwin上运行3.6.8版本。在Windows 3.7.3rc1版本下也会出现相同的结果。你知道吗

2019年7月18日新增加的职位: 进一步检查发现,调用函数进行表格打印是导致问题的原因。该函数将向量作为列与二维数组一起打印。这是通过如下方式重塑向量来实现的: a.shape = (n,1)
在函数调用之后,这个重塑被传递回调用例程。因为dp是(5,1),所以乘法是(5,1)矩阵乘以(5,1)向量。广播被调用,结果是(5,5)。你知道吗

我是一个新的python程序员,我(错误地)认为对输入的这种修改不会传递回调用者。以这种方式修改函数输入是错误的吗?是否应该在函数中将其标记为错误?我理解C传递值和Fortran传递引用,但不理解Python如何将参数传递给函数。有人能给我解释一下在Python中调用约定吗?你知道吗

根据这一发现,这篇文章的标题是完全错误的。我现在的问题是-为什么Python允许我更改函数的输入?是否值得以不同的标题发布?你知道吗


Tags: 函数in错误npcode矩阵shell向量
1条回答
网友
1楼 · 发布于 2024-05-16 11:07:29

尝试重新创建您的示例:

In [104]: dpx=np.arange(5); dpx.shape                                                                        
Out[104]: (5,)
In [105]: dx = np.zeros((1,5)); dx.shape                                                                     
Out[105]: (1, 5)
In [106]: dpx*dx[0,:]                                                                                        
Out[106]: array([0., 0., 0., 0., 0.])
In [107]: _.shape                                                                                            
Out[107]: (5,)

关于你的新信息。你知道吗

a.shape = (n,1)

此操作更改a本身的形状,其中as np.reshape(a, (n,1))a.reshape(n1,1)使用新形状创建新数组(但通常是view,共享数据缓冲区)。你知道吗

传递给函数时:

def foo(a, b):
    a.shape = (n,1)
    b = b.reshape(n,1)

foo(A,B)

AB都通过引用传递给foo。也就是说,外部名称空间中A引用的对象被内部名称空间中的a引用。a.shape会就地更改该对象,然后此更改会出现在A引用的同一对象中。你知道吗

但是B没有改变。b获取新的对象分配,并成为localBb之间的链接断开。你知道吗

一般来说,Python不会自动复制对象,至少不会简单地将对象传递给函数(或传递回函数)。你必须自己制作它们,或者使用生成新对象的函数。你知道吗

我不确定术语是否正确,但这个答案符合我的理解:

https://stackoverflow.com/a/33066581/901925

相关问题 更多 >