我需要对一些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方法来实现相同的结果也提高了性能
你的功能:
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
中正确“矢量化”计算。
取决于'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]])