Python 避免使用numpy数组嵌套

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方法来实现同样的结果,这也

我需要在一些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方法来实现同样的结果,这也可以提高性能

取决于“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]])