2015-10-31 49 views
0

我有三角形,其中每個線路具有3個verticies的矩陣: ELEMENTSET:如何在Python中爲矩陣中的每個元素應用函數?

Element Number  Vertices 
    2   473 1159 917 
    3   271 1026 816 

我也有分配協調每頂點一個2D節點的矩陣 節點集:

Vertice Number     (X,Y) 
917    5.487167292060809 2.195789288329368 
271    5.448888739433895 2.38822856765269 

我已經寫了一些處理面積計算的方法,它們包含在一個類中:

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 

我想用油杉()來計算以這個例子中的相同方式傳遞數組作爲參數:

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,:])) 

我想申請油杉方法,但現在我只得到,當我想一個2個dimmensions陣列獲取數組一樣dimmension原始載體

a.calcArea(f[0,:],f[1,:],f[2,:]) 
array([ 7.5, 0. ]) 
+1

你必須手動做到這一點,你不能使用其他軟件包,如'pandas' – Leb

+0

我必須做手工=(如果你使用numpy.sin(),您可以應用到矩陣,我必須做同樣的工作 –

+1

'map(function,sequence)'如何? – flamenco

回答

1

使用您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]) 

在第一維上建立索引時,(* ...)執行相同的操作。但是,在你的類如果你正在嘗試選擇列,不列

In [422]: f1=f.T 
In [423]: test(f1[:,1],f1[:,2]) 
Out[423]: array([ 18, 28, 207, 204, 224]) 
In [424]: test(*f1[:,:2]) 
... 
TypeError: test() takes 2 positional arguments but 5 were given 

(*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]) 
+0

我明白這一點。它沒有任何意義,爲什麼它可以與測試一起使用,但不適用於calcArea() –

+0

我的編輯是否讓它更清晰? – hpaulj

1

如果你可以重新安排你的數據轉換爲一組三包含所有三角形的第一,第二和第三個頂點座標的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) 

時間:

In [41]: %%timeit P1, P2, P3 = np.random.randn(3, 2, 100000) 
    ....: triangle_area(P1, P2, P3) 
    ....: 
1000 loops, best of 3: 1.09 ms per loop 
相關問題