Python 避免使用numpy数组嵌套
我需要在一些NP2D数组(a、B、C)的元素上实现一个通用操作。伪码Python 避免使用numpy数组嵌套,python,numpy,for-loop,nested-loops,Python,Numpy,For Loop,Nested Loops,我需要在一些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()通过struct.pack()和struct.unpack()连接两个变量的位 这段代码需要很长时间才能执行(640*480矩阵的执行时间为0.25秒…可能是正常的,但我可以使用更快的代码),所以我想知道是否有人可以建议我一些pythonic方法来实现同样的结果,这也
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()连接两个变量的位
这段代码需要很长时间才能执行(640*480矩阵的执行时间为0.25秒…可能是正常的,但我可以使用更快的代码),所以我想知道是否有人可以建议我一些pythonic方法来实现同样的结果,这也可以提高性能取决于“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]])
你的职能:
In [310]: def foo(a,b):
...: x = struct.pack('2B', a,b)
...: return struct.unpack('H',x)[0]
矢量化是一种方便的阵列广播方式。它将标量值传递给函数。它不会加快代码的速度(相对于普通迭代,pyfunc的相关可能会加快2倍)
我可以用一个简单的数学表达式在相同的数组上复制这些值:
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()
的功能。您可以尝试使用线程或多处理。在不知道f
在做什么、数据有多大或“执行的时间有多长”的情况下,不确定您希望任何人如何回答实际上是指。你能修改f
来利用它吗?不是嵌套本身慢,而是调用你的函数300000次。struct
代码已编译(内置)。有没有一种不用普通的全数组数学就可以得到这些值的方法?加上,时间,模数?
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]])