2016-07-23 53 views
0

我不知道你是否可以定义一个函数同时作用于一维numpy数组的所有元素,这样你就不必遍历数组。例如,类似于您可以将数组的所有元素放在一起而不循环。的我后的一个例子是将这段代码:作用于numpy数组的所有元素的函数?

A = np.array([ [1,4,2], [5,1,8], [2,9,5], [3,6,6] ]) 
B = [] 

for i in A: 
    B.append(i[0] + i[1] - i[2]) 

B = array(B) 
print B 

输出:

>>> array([3, -2, 6, 3]) 

的东西,如:

A = np.array([ [1,4,2], [5,1,8], [2,9,5], [3,6,6] ]) 

def F(Z): 
    return Z[0] + Z[1] - Z[2] 

print F(A) 

使输出是一样的东西:

>>> array([ [3] , [-2], [6], [3] ]) 

我知道第二个代码w不会产生我所追求的,但我只是想说出我在说什么。谢谢!

编辑:

我用上面的函数只是一个简单的例子。我想用真正的功能是这样的:

from numpy import linalg as LA 

def F(Z): 
    #Z is an array of matrices 
    return LA.eigh(Z)[0] 

所以我有3×3矩阵阵列,我想他们的特征值的输出数组。我想知道是否有可能以某种numpythonic的方式做到这一点,以便不必遍历数组。

+0

切片可能会有所帮助:http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#basic-slicing-and-indexing – Divakar

+3

'B = A [:,0] + A [:, 1] - A [:, 2]'? (假设你的意思是'我[2]'而不是'[2]')或者你可以使用'np.dot':你实质上是在这里做一个矩阵一矢量乘法。 –

+1

'numpy'已经定义了一组基本的函数,这些函数对一个或多个数组的所有元素进行操作。有效的'numpy'代码结合了这些功能。把它想象成一堆“平行”的积木。在“串行”思考之前尝试使用它们(循环遍历“标量”函数)。 – hpaulj

回答

3

尝试:

np.apply_along_axis(F, 1, A) 
+2

然而,在这种特殊情况下,这是不必要的低效率,因为在'apply_along_axis'的实现中涉及到Python级''for'循环。 (呃,实际上,这是一个'while'循环,但它也是一样。)简单的切片解决方案可能会更好。 –

+0

是的,这是事实。我只是跑了一些测试,这个解决方案不能比for循环更快。这绝对是一种更有效的编写代码的方式,但它并没有减少计算效率,这是我的目标。我认为切片可能是要走的路。感谢大家的回复。 – cracka31

相关问题