避免用numpy数组嵌套for

2024-09-29 23:21:22 发布

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

我需要在一些np2d数组(a,B,C)的元素上实现一个通用操作。在伪代码中

for i in A.height:
    for j in A.width:
        A[i,j] = f(B[i,j],C[i,j])

其中f()通过结构包(), 解包结构()

^{pr2}$

这段代码需要很长时间才能执行(对于640*480矩阵,0.25秒。。。也许这是正常的,但我可以用更快的东西),所以我想知道是否有人可以给我一些Python式的方法来达到同样的效果,也可以提高性能


Tags: 方法代码in元素for矩阵数组性能
2条回答

您的职能:

In [310]: def foo(a,b):
     ...:     x = struct.pack('2B', a,b)
     ...:     return struct.unpack('H',x)[0]

np.vectorize是广播阵列的一种便捷方式。它将标量值传递给函数。它不会加快代码的速度(相关的frompyfunc可能会比普通迭代快2倍)

^{pr2}$

我可以用一个简单的数学表达式在相同的数组上复制这些值:

In [313]: np.arange(5)[:,None]+np.arange(10)*256
Out[313]: 
array([[   0,  256,  512,  768, 1024, 1280, 1536, 1792, 2048, 2304],
       [   1,  257,  513,  769, 1025, 1281, 1537, 1793, 2049, 2305],
       [   2,  258,  514,  770, 1026, 1282, 1538, 1794, 2050, 2306],
       [   3,  259,  515,  771, 1027, 1283, 1539, 1795, 2051, 2307],
       [   4,  260,  516,  772, 1028, 1284, 1540, 1796, 2052, 2308]])

这可能只适用于有限的值范围,但它提供了一个如何在numpy中正确“矢量化”计算的方法。在

取决于“f”的作用。。。不知道这是不是你的意思

b = np.arange(3*4).reshape(3,4)
c = np.arange(3*4).reshape(3,4)[::-1]

b
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

c
array([[ 8,  9, 10, 11],
       [ 4,  5,  6,  7],
       [ 0,  1,  2,  3]])

def f(b, c):
    """some function"""
    a = b + c
    return a

a = f(b, c)
a 
array([[ 8, 10, 12, 14],
       [ 8, 10, 12, 14],
       [ 8, 10, 12, 14]])

相关问题 更多 >

    热门问题