2016-12-07 61 views
0

我有一个叫做A的维(3,n)的2d矩阵,我想计算两个数组(b,z)的归一化和叉积, (请参阅代码)每列(第一列,然后第二列等)。从2d数组中获得列来计算python中的归一化和叉积

让的说,A是:

A=[[-0.00022939 -0.04265404 0.00022939] 
 
[ 0.   -0.2096513 0.  ] 
 
[ 0.00026388 0.00465183 0.00026388]]
如何可以采取第一列从A(-0.00022939,O.,0.00026388)并且在下面的函数中使用它,则取然后第二列,... n列

def vectors(b): 
    b = b/np.sqrt(np.sum(b**2.,axis=0)) 
    b = b/np.linalg.norm(b)  
    z = np.array([0.,0.,1.]) 
    n1 = np.cross(z,b,axis=0) 
    n1 = n1/np.linalg.norm(n1) ## normalize n 

    return [n1] 

n1 = vectors(A) 

我该如何制作一个选择第一列并进行计算的循环,然后是第二列等等。任何帮助!预先感谢

+0

任何帮助,请! –

+0

我建议你添加一个样本矩阵'A'并显示你所期望的结果。请详细说明你想要的东西。我不明白。 –

+0

@ mr.bjerre,我已经完成了整个矩阵,它有效,但我想使用第一列,然后第二个,...直到n列 –

回答

1

这取决于你如何设置你的阵列开始。我喜欢使用numpy数组,因为我发现索引容易让我头脑发热。我认为下面的代码就是你以后的代码。因为你总是有3个colulmns,所以A不需要多长时间,你可以将它分成3列。

import numpy as np 

A=np.array([[-0.00022939, -0.04265404, 0.00022939], 
      [-0.00022939, -0.04265404, 0.00022939], 
      [0., -0.2096513, 0.], 
      [0.00026388, 0.00465183, 0.00026388]]) 

for idx in range(3): 

    b = A[:, idx] 
    print b # call your function here 

编辑::全面实施显示代码&输出

import numpy as np 

def vectors(b): 
    b = b/np.sqrt(np.sum(b**2.,axis=0)) 
    b = b/np.linalg.norm(b)  
    z = np.array([0.,0.,1.]) 
    n1 = np.cross(z,b,axis=0) 
    n1 = n1/np.linalg.norm(n1) ## normalize n 

    return [n1] 

A=np.array([[-0.00022939, -0.04265404, 0.00022939], 
      [ 0.,   -0.2096513, 0.  ], 
      [ 0.00026388, 0.00026388, 0.00026388]]) 

for idx in range(3): 

    b = A[:, idx] 
    n1 = vectors(b) 
    print 'idx', idx, '\nb ', b, '\nn1 ', n1, '\n' 

Output: 

    idx 0 
    b [-0.00022939 0.   0.00026388] 
    n1 [array([ 0., -1., 0.])] 

    idx 1 
    b [-0.04265404 -0.2096513 0.00026388] 
    n1 [array([ 0.9799247 , -0.19936794, 0.  ])] 

    idx 2 
    b [ 0.00022939 0.   0.00026388] 
    n1 [array([ 0., 1., 0.])] 
+0

谢谢@DrBwts它的工作原理 –

+0

当我在我的代码(矢量),函数您提到的循环仅为第一列提供了n1和n2的值,而不是每列。因为我需要为每列计算n1和n2? –

+0

@ AL-Zetoun它工作正常,因为我看到在我的回复中做出的编辑 – DrBwts

0

你可以试试这个:

A=[[1,2,3],[4,5,6],[7,8,9]] 

def getColumn(m): 
    res=[] 
    for x in A: 
     res.append(x[m]) 
    return res 

def countSomething(x): 
    # counting code here 
    print x 

def looper(n): # n is the second dimension size 
    for x in xrange(0,n): 
     countSomething(getColumn(x)) 

looper(3) 
+0

谢谢@Jaroslaw –

+0

即时通讯我试图使用你的代码,通过函数向量代替函数countsomething在我的代码上面,但它不起作用? 'def countSomething(b): b = b/np.sqrt(np.sum(b ** 2,axis = 0)) b = b/np.linalg.norm(b)\t z = np。 array([0.,0.1]) n1 = np.cross(z,b,axis = 0) n1 = n1/np.linalg.norm(n1)## normalize n n2 = np。 (b,n1,axis = 0) n2 = n2/np.linalg.norm(n2) return n1,n2' –