表示矩阵未对齐的NumPy错误

2024-10-02 08:28:32 发布

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

如果我跑:

x = np.zeros(6)
y = np.zeros([7, 6])
z = y * x

然后一切正常,没有Python错误。你知道吗

但是,我使用的Python模块(calliffoo)包含一个函数(callifbar),它返回一个7x6numpy数组。它的形状与上面的y相同,数据类型也相同(float64)。但当我运行以下命令时:

x = np.zeros(6)
y = foo.bar()
z = y * x

我得到以下错误:

ValueError: shapes (7,6) and (1,6) not aligned: 6 (dim 1) != 1 (dim 0)

但据我所知,y在这两个示例中是完全相同的格式,具有相同的形状和数据类型。是什么导致了这个错误,为什么在第一个例子中不是这样的呢?你知道吗


Tags: 模块函数命令foo错误npzerosbar
2条回答
In [446]: x = np.zeros(6) 
     ...: y = np.zeros([7, 6]) 
     ...: z = y * x                                                                                    
In [447]: z.shape                                                                                      
Out[447]: (7, 6)

这里我们做的是元素乘法,a(7,6)和a(6,)。通过广播,(6,)变成(1,6),然后(7,6)来匹配y。你知道吗

显然,在foo.bar情况下,ynp.matrix子类:

In [454]: y1 = np.matrix(y)                                                                            
In [455]: y1*x                                                                                         
 -...
    219             # This promotes 1-D vectors to row vectors
 > 220             return N.dot(self, asmatrix(other))
...
ValueError: shapes (7,6) and (1,6) not aligned: 6 (dim 1) != 1 (dim 0)

注意y1的不同显示:

In [456]: y1                                                                                           
Out[456]: 
matrix([[0., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0., 0.]])

np.matrix*定义为np.dot,矩阵积。x也被转换成np.matrix,产生(1,6)矩阵。错误信息来自矩阵乘法的定义。你知道吗

np.multiply可以用来强制按元素进行乘法。请注意结果的类别:

In [458]: np.multiply(y1,x)                                                                            
Out[458]: 
matrix([[0., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0., 0.]])

因为这样的混乱np.matrix正在被劝阻。你知道吗

我不知道您运行的是哪个版本,但我运行的是Python3上的1.16.3版本。你知道吗

在我看来,您对x的定义与示例片段中的不同。你似乎把它定义为一个6x1矩阵,而不是一个“向量”,它在Numpy上被认为只有一个维度。尝试将y乘以np.zeros([6,1]),您将看到一个错误。你知道吗

底线是:

  1. 在调试时经常使用.shape属性,它在执行矩阵乘法时非常有用。你知道吗
  2. 在np上,一个矩阵和一维数组之间的乘法运算与两个矩阵之间的乘法运算是不同的。你知道吗

相关问题 更多 >

    热门问题