如何在Python中为矩阵中的每个元素应用函数?

2024-09-27 23:24:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个三角形矩阵,其中每条直线有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. ])

Tags: 方法self元素returndef矩阵数组point
2条回答

如果您可以将数据重新排列为一组包含所有三角形第一、第二和第三个顶点的x,y坐标的一组二维数组(例如,使用(2, n),其中n是三角形的数量),则可以轻松地将所有三角形的计算矢量化:

import numpy as np

# adapted from your code. here p1, p2 and p3 are (2, ...) vectors of x,y coords.
def triangle_area(p1, p2, p3):
      return 0.5 * np.abs(p1[0] * (p2[1] - p3[1]) +
                          p2[0] * (p3[1] - p1[1]) +
                          p3[0] * (p1[1] - p2[1]))

n = 100000

# some random vertex data
vert_data = np.random.randn(3, 2, n)

# each of these is a (2, n) vector of x,y coordinates
P1, P2, P3 = vert_data

# a 100000-long vector of areas
areas = triangle_area(P1, P2, P3)

时间安排:

^{pr2}$

使用您的testf

In [420]: test(f[0,:],f[1,:])
Out[420]: array([ 3,  8, 45, 36, 49])
In [421]: test(*f[:2,:])
Out[421]: array([ 3,  8, 45, 36, 49])

在第一个维度上建立索引时,(*…)会执行相同的操作。但是在你的类案例中,你试图选择列,而不是行

^{pr2}$

(*f1...)扩展为(f1[0,:2],f1[1,:2],f1[2,:2],etc)*膨胀实际上是第一维度上的一个交互作用。在


calcArea接受3个参数,但是self.calcArea(*self.elementSet[:,-3:])沿着elementSet的第一个维度展开,而不是最后一个大小为3的维度。试试看

self.calcArea(self.elementSet[:,0], self.elementSet[:,1], self.elementSet[:,2])

相关问题 更多 >

    热门问题