避免使用numpy数组嵌套

问题描述 投票:-4回答:2

我需要对一些np 2D数组(A,B,C)的元素实现泛型操作。在伪代码中

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

其中f()通过struct.pack(),struct.unpack()连接两个变量的位

            x = struct.pack('2B', B[i, j], C[i, j])
            y = struct.unpack('H', x)

这段代码需要很长时间才能执行(640 * 480矩阵为0.25秒......也许是正常但我可以更快地使用某些东西),所以我想知道是否有人可以建议我采用一些pythonic方法来实现相同的结果也提高了性能

python numpy for-loop nested-loops
2个回答
1
投票

你的功能:

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

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

In [311]: fv = np.vectorize(foo)
In [312]: fv(np.arange(5)[:,None],np.arange(10))
Out[312]: 
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]])

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

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中正确“矢量化”计算。


0
投票

取决于'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]])
© www.soinside.com 2019 - 2024. All rights reserved.