我有一个三角形矩阵,其中每条直线有3个垂直方向: 元素集:
Element Number Vertices
2 473 1159 917
3 271 1026 816
我也有一个节点矩阵,它为每个垂直点指定一个二维坐标 节点集:
^{pr2}$我写了一些处理面积计算的方法,它们包含在一个类中:
def findArea(self):
self.elementsArea = nu.zeros((self.elementSet.shape[0],1))
self.elementsArea[:] = self.calcArea(*self.elementSet[:,-3:])
#Calculate the area of 3 points
def calcArea (self,p1,p2,p3):
[p1,p2,p3] = [self.nodeCoord(p1),self.nodeCoord(p2),self.nodeCoord(p3)]
return 0.5*abs(p1[Xc]*(p2[Yc] - p3[Yc]) + p2[Xc]*(p3[Yc]-p1[Yc]) + p3[Xc]*(p1[Yc] - p2[Yc]))
# returns the vertices of a point
def nodeCoord(self, point):
return(self.nodeSet[point-1,-3:-1])
其中函数calcArea
工作正常,但我想将函数应用于矩阵的每个元素,并在不使用循环的情况下分配给另一个矩阵。在
我必须写一些东西,比如:
A[:] = func(B[:])
在def findArea()
中,我试图做这样的事情,但它给了我以下错误:
calcArea() takes 4 positional arguments but 2171 were given
我想用calrea()来计算作为参数的区域传递数组,方法与我在本例中所做的相同:
import numpy as np
def test(x,y):
return x*y
f = np.array([[1,2,5,6,7] , [3,4,9,6,7] ,[6,7,23,34,32]])
print(test(f[0,:],f[1,:]))
我试图应用calarea方法,但我现在只得到了一个2dimmensions数组,而我本应该得到一个与原始向量相同的dimmension数组
a.calcArea(f[0,:],f[1,:],f[2,:])
array([ 7.5, 0. ])
如果您可以将数据重新排列为一组包含所有三角形第一、第二和第三个顶点的x,y坐标的一组二维数组(例如,使用
(2, n)
,其中n
是三角形的数量),则可以轻松地将所有三角形的计算矢量化:时间安排:
^{pr2}$使用您的
test
和f
:在第一个维度上建立索引时,(*…)会执行相同的操作。但是在你的类案例中,你试图选择列,而不是行
^{pr2}$(*f1...)
扩展为(f1[0,:2],f1[1,:2],f1[2,:2],etc)
。*
膨胀实际上是第一维度上的一个交互作用。在calcArea
接受3个参数,但是self.calcArea(*self.elementSet[:,-3:])
沿着elementSet
的第一个维度展开,而不是最后一个大小为3的维度。试试看相关问题 更多 >
编程相关推荐