Numpy np.dot()在多维数组上

时间:2015-06-30 03:08:40

标签: python arrays numpy

这是一个简单的问题,但我对所涉及的尺寸感到困惑。

使用NumPy,我有一个三维数组,shape =(10,100,100)。

(我认为它的方式是10"矩阵"的np.ndarray,每个形状100乘100,即

arr1 = [M1 M2 M3....M10]

其中M1.shape = (100,100), M2.shape = (100,100),...

我还有一个名为" arrB"的第二个数据数组,它是arrB.shaped (100,)。我的目标是使用这些numpy数组进行矩阵乘法,即(arrB.T)*arr1*(arrB),得到一个整数。使用numpy数组时,应使用np.dot()

完成此操作
op1 = np.dot(arr1, arrB)
op2 = np.dot((arrB.T), op1)

endproduct = np.dot((arrB.T), np.dot(arr1, arrB) )

然而,这不起作用。我收到一个错误:

ValueError: shapes (100,) and (10,100) not aligned: 100 (dim 0) != 10 (dim 0)

如果我在一个"矩阵"上进行操作M#一次,我可以执行此操作,即

element1 = arr1[0]
end = np.dot((arrB.T), np.dot(element1, arrB) )

如果没有拼接原始数组,执行操作并再次追加,我如何在原始数组arr1上执行这些操作才能生成

result = [(arrB.T)*arr1[0]*(arrB) (arrB.T)*arr1[1]*(arrB) (arrB.T)*arr1[2]*(arrB) ... 
                                                ....(arrB.T)*arr1[9]*(arrB) ]

2 个答案:

答案 0 :(得分:4)

使用arrB,形状(100,),.T不执行任何操作。如果您希望(1,100)将其转换为.T数组,则必须为(100,1)

无论如何,要用(100,100)元素做双点,你不需要.T。尝试:

np.dot(arrB, np.dot(element1, arrB) )

只有10个元素',列表理解或迭代方法并不坏:

out = np.empty((10,))
for i in range(10):
   out[i] = np.dot(arrB, np.dot(arrA[i], arrB))

或使用理解:

np.array([np.dot(arrB,np.dot(elmt,arrB)) for elmt in arrA] )

np.einsum是另一种选择:

np.einsum('i,kij,j->k',arrB, arrA, arrB)

np.tensordot也适用于3d数组。它重新整形和转置其输入,因此它们成为np.dot可以使用的二维数组。

np.dot(np.tensordot(arrA,arrB,[(2,),(0,)]),arrB) # needs more testing

您必须使用真实数组进行一些计时,以确定哪种方法最适合您(和可读)。

答案 1 :(得分:0)

您可以将列表理解用作 -

public PartialViewResult ClientSearch(ClientViewModel data) {
    var model=new ClientViewModel();

    //get all clients if dropdowns and searchstring is null / nonselected
    if ((data.SelectedLocation==null) && (data.SelectedClientStatus==null) && (data.SearchString=="" || data.SearchString==null)) {
        model.ClientsCollection=_ClientService.Get(null, null, "ClientsProfile, ClientsMobiles").ToList();
        return PartialView("_ClientsResult", model);
    }
    //get clients based on searchstring if no dropdown is selected but searchstring is not null/blank
    else if ((data.SelectedLocation==null) && (data.SelectedClientStatus==null) && !(data.SearchString=="" || data.SearchString==null)) {
        model.ClientsCollection=_ClientService.Get(u=> u.FullName.Contains(data.SearchString), null, "ClientsProfile, ClientsMobiles").ToList();
        return PartialView("_ClientsResult", model);
    }
    else if (data.SelectedLocation==null && !(data.SelectedClientStatus==null) && (data.SearchString=="" || data.SearchString==null)) {
        model.ClientsCollection=_ClientService.Get(u=> u.StatusID==data.SelectedClientStatus, null, "ClientsProfile, ClientsMobiles").ToList();
        return PartialView("_ClientsResult", model);
    }
    else if (!(data.SelectedLocation==null) && (data.SelectedClientStatus==null) && (data.SearchString=="" || data.SearchString==null)) {
        model.ClientsCollection=_ClientService.Get(u=> u.LocationID==data.SelectedLocation, null, "ClientsProfile, ClientsMobiles").ToList();
        return PartialView("_ClientsResult", model);
    }
    else {
        model.ClientsCollection=_ClientService.Get(u=> u.LocationID==data.SelectedLocation && u.StatusID==data.SelectedClientStatus && u.FullName.Contains(data.SearchString), null, "ClientsProfile, ClientsMobiles").ToList();
        return PartialView("_ClientsResult", model);
    }
}