簡體   English   中英

核心維度中的Python numpy矩陣乘法不匹配

[英]Python numpy matrix multiplication mismatch in core dimension

我正在嘗試將 2x2 矩陣與 2x1 矩陣相乘。 兩個矩陣都有 linspace 的條目,因此生成的 2x1 矩陣為我提供了 linspace 的每個值的值。

然而,我得到了這個維度錯誤。

matmul:輸入操作數 1 在其核心維度 0 中存在不匹配,具有 gufunc 簽名 (n?,k),(k,m?)->(n?,m?)(大小 1 與 2 不同)

為了可讀性,我沒有發布整個代碼,而是發布必要的代碼。

我還用指示性文本替換了 linspace 值。

矩陣“L”是包含常數的其他 2x2 乘法的結果,因此沒有錯誤。

矩陣 B (2x2) 給出了想要的結果,所以問題歸結為 B 和 C 之間的乘法。

import numpy as np
from sympy import *

# Defining range of values
z = np.linspace(initial, final, 10)
g = np.linspace(initial, final, 10)
y = np.linspace(initial, final, 10)

# Matrix operations
A = np.array([[1, z], [0, 1]], dtype=object)
B = np.matmul(L,A)
C = np.array([[y],[g]])

D = np.matmul(B, C)

print(total)

我正在嘗試做的另一種 POV 是當矩陣“B”與包含未知數的 2x1“C”相乘時,計算那些未知數“y”和“g”

非常感謝,

PS; 對於具有單值條目的數組“C”,乘法按預期運行。

編輯; 根據 mozway 的建議,我提供數組“A”和“M”的打印,這將使內容更清晰,但讓 M = B

在此處輸入圖片說明

不確定您要做什么(您應該提供一個可重現的示例,目前缺少許多變量)以及預期的輸出。

然而, A的定義從根本上是錯誤的。 我想你期望一個 2x2 數組,但由於z是一個(10,)形狀的數組,你最終會得到 A 是一個奇怪的對象數組,其元素 (0,1) 是一個數組。

這可以防止您進行任何進一步的數學運算。

In [66]: initial, final = 0,1
In [67]: z = np.linspace(initial,final,11)
In [68]: z
Out[68]: array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ])

A是 (2,2),但包含數組和標量的混合

In [69]: A = np.array([[1,z],[0,1]], object)
In [70]: A
Out[70]: 
array([[1,
        array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ])],
       [0, 1]], dtype=object)
In [71]: A.shape
Out[71]: (2, 2)

現在創建一個 (2,2) 數值數組:

In [72]: L = np.eye(2)
In [75]: L[1,1] = 2
In [76]: np.matmul(L,A)
Out[76]: 
array([[1.0,
        array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ])],
       [0.0, array([2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2.])]],
      dtype=object)

matmul確實適用於對象matmul數組,前提是元素實現了必要的+* 結果仍然是 (2,2),但 (1,1) 項2*z

現在對於C

In [77]: C = np.array([[z],[z]])
In [78]: C
Out[78]: 
array([[[0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ]],

       [[0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ]]])
In [79]: C.shape
Out[79]: (2, 1, 11)

這是 float dtype,3d 數組。

In [81]: B=Out[76]
In [82]: np.matmul(B,C)
Traceback (most recent call last):
  File "<ipython-input-82-5eababb7341e>", line 1, in <module>
    np.matmul(B,C)
ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 1 is different from 2)

In [83]: B.shape
Out[83]: (2, 2)
In [84]: C.shape
Out[84]: (2, 1, 11)

形狀不匹配。 但是改變C定義,所以它是一個二維數組:

In [85]: C = np.array([z,z])
In [86]: C.shape
Out[86]: (2, 11)
In [87]: np.matmul(B,C)
Out[87]: 
array([[array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]),
        array([0.1 , 0.11, 0.12, 0.13, 0.14, 0.15, 0.16, 0.17, 0.18, 0.19, 0.2 ]),
 ...
        array([1.8, 1.8, 1.8, 1.8, 1.8, 1.8, 1.8, 1.8, 1.8, 1.8, 1.8]),
        array([2., 2., 2., 2., 2., 2., 2., 2., 2., 2., 2.])]],
      dtype=object)
In [88]: _.shape
Out[88]: (2, 11)

這里 (2,2) B matmuls 與 (2,11) 正好產生 (2,11)。 但是每個元素本身都是一個 (11,) 數組 - 因為在定義A使用了z

但是你說你想要一個 (2,1) C 為了得到它,我們必須使用:

In [91]: C = np.empty((2,1), object)
In [93]: C[:,0]=[z,z]
In [94]: C
Out[94]: 
array([[array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ])],
       [array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ])]],
      dtype=object)

嘗試創建object dtype 數組時要非常小心。 事情可能不是你所期望的。

現在 (2,2) 的 matmul 與 (2,1) => (2,1),對象數據類型

In [95]: D = np.matmul(B,C)
In [96]: D.shape
Out[96]: (2, 1)
In [99]: D
Out[99]: 
array([[array([0.  , 0.11, 0.24, 0.39, 0.56, 0.75, 0.96, 1.19, 1.44, 1.71, 2.  ])],
       [array([0. , 0.2, 0.4, 0.6, 0.8, 1. , 1.2, 1.4, 1.6, 1.8, 2. ])]],
      dtype=object)

請記住, matmul處理數字 dtype 數組的速度非常快。 它確實適用於對象 dtype 數組,但速度要慢得多,更像是使用列表推導式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM