[英]Numpy: Iterate multiplication of 3D array by 1D array
我有一个 3D 数组(4,3,3),我想在其中迭代地乘以一维数组(t 变量)并求和以得到一个数组(A),它是四个 3,3 arrays 的总和我不确定我应该如何分配索引或者我应该如何以及是否应该使用 np.ndenumerate
谢谢
import numpy as np
import math
#Enter material constants for calculation of stiffness matrix
E1 = 20
E2 = 1.2
G12 = 0.8
v12=0.25
v21=(v12/E1)*E2
theta = np.array([30,-30,-30,30])
deg = ((math.pi*theta/180))
k = len(theta) #number of layers
t = np.array([0.005,0.005,0.005,0.005])
#Calculation of Q Values
Q11 = 1
Q12 = 2
Q21 = 3
Q22 = 4
Q66 = 5
Qbar = np.zeros((len(theta),3,3),order='F')
#CALCULATING THE VALUES OF THE QBAR MATRIX
for i, x in np.ndenumerate(deg):
m= np.cos(x) #sin of rotated lamina
n= np.sin(x) #cos of rotated lamina
Qbar11=Q11*3
Qbar12=Q22*4
Qbar16=Q16*4
Qbar21 = Qbar12
Qbar22=Q22*1
Qbar26=Q66*2
Qbar66=Q12*3
Qbar[i] = np.array([[Qbar11, Qbar12, Qbar16], [Qbar21, Qbar22, Qbar26], [Qbar16, Qbar26, Qbar66]], order = 'F')
print(Qbar)
A = np.zeros((3,3))
for i in np.nditer(t):
A[i]=Qbar[i]*t[i]
A=sum(A[i])
如果我理解正确,您想在第一个轴上乘以Qbar
和t
,然后在第一个轴上对结果求和(这会产生一个形状为(3, 3)
的数组)。
我创建了随机 arrays 以使代码最小化:
import numpy as np
Qbar = np.random.randint(2, size=(4, 3, 3))
t = np.arange(4)
A = (Qbar * t[:, None, None]).sum(axis=0)
t[:, None, None]
将创建两个新维度,以便形状变为(4, 1, 1)
,可以将其乘以Qbar
元素。 然后我们只需要对第一个轴求和。
注意: A = np.tensordot(t, Qbar, axes=([0],[0]))
也适用,并且对于更大的尺寸可以更快,但对于您提供的尺寸,我更喜欢第一个解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.