2024-09-29 23:21:22 发布
网友
我需要在一些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()通过结构包(), 解包结构()
这段代码需要很长时间才能执行(对于640*480矩阵,0.25秒。。。也许这是正常的,但我可以用更快的东西),所以我想知道是否有人可以给我一些Python式的方法来达到同样的效果,也可以提高性能
您的职能:
In [310]: def foo(a,b): ...: x = struct.pack('2B', a,b) ...: return struct.unpack('H',x)[0]
np.vectorize是广播阵列的一种便捷方式。它将标量值传递给函数。它不会加快代码的速度(相关的frompyfunc可能会比普通迭代快2倍)
np.vectorize
frompyfunc
我可以用一个简单的数学表达式在相同的数组上复制这些值:
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中正确“矢量化”计算的方法。在
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]])
您的职能:
^{pr2}$np.vectorize
是广播阵列的一种便捷方式。它将标量值传递给函数。它不会加快代码的速度(相关的frompyfunc
可能会比普通迭代快2倍)我可以用一个简单的数学表达式在相同的数组上复制这些值:
这可能只适用于有限的值范围,但它提供了一个如何在
numpy
中正确“矢量化”计算的方法。在取决于“f”的作用。。。不知道这是不是你的意思
相关问题 更多 >
编程相关推荐