这是一个简单的问题,但我对所涉及的尺寸感到困惑。
使用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) ]
答案 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);
}
}