繁体   English   中英

Numpy:迭代 3D 数组乘以一维数组

[英]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])

如果我理解正确,您想在第一个轴上乘以Qbart ,然后在第一个轴上对结果求和(这会产生一个形状为(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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM