将多个 numpy 数组排序为一个,如:[1,2,..n, 1,2..n]

sort multible numpy arrays into one like: [1,2,..n, 1,2..n]

我有六个 numpy 数组,我需要将它们转换成一个数组或更好的列表(如果有更快的方法如 tolist(),你会推荐我)。无论如何,我需要它来处理来自 .gif 的图像数据,所以它必须非常快。我最近的尝试以 8 帧/秒的处理时间结束。我将数组转换为列表,但我很确定是否可以使用数组方法来完成它会更快。

数组具有相同的长度,它们是一维的,长度从 4096 开始,并填充了布尔值。

它应该遵循的原则:

a = array((1,3,5))
b = array((2,4,6))

>>> array([1, 2, 3, 4, 5, 6])

这是我最近的尝试:

for x in range(size):
    counter += 1
    print(b0[x]
    data_bin.insert(0, 0)
    data_bin.insert(1, 0)
    data_bin.insert(2, b0[x])
    data_bin.insert(3, b1[x])
    data_bin.insert(4, r0[x])
    data_bin.insert(5, g0[x])
    data_bin.insert(6, r1[x])
    data_bin.insert(7, g1[x])

然后我将 data_bin 写入内存 space 并清除该值。我可以在 10 毫秒内写 1 帧,所以整个例程应该花费我大约 8 毫秒。

为了避免混淆,我以数组格式从图像中获取数据,并且必须按正确的顺序获取它们。之后我必须将它转换为字符串,因为这是我将它写入内存的最快方式。

谢谢:)

根据您想要的输出,我会说:

np.dstack((a, b)).flatten()

array([1, 2, 3, 4, 5, 6])

但是上下文有点不清楚。你从什么类型的数组开始?无论如何,我会尽可能地坚持使用 Numpy,并避免大量的列表操作。逐个元素插入列表可能会导致列表的多次重新分配,因为大小会继续扩大。这是不必要的,因为您已经预先确定了大小。

您似乎正在 从六个输入中逐个插入 个元素,但是从最后一个元素开始直到每个输入的第一个元素。基本上这是一个串联过程,以固定间隔附加零 (2+6)。

一种代替循环有效执行此操作的方法是 np.concatenate -

size = len(b0)  # Must be 4096

# Initialize output as a 2D array with zeros that would also hold all elements 
# from the six inputs
out = np.zeros((size,8),dtype=b0.dtype)

# Leave first two elements in each row and 
# put inputs-concatenated and flipped version into the output array  
out[:,2:] = np.concatenate((b0,b1,r0,g0,r1,g1)).reshape(-1,size)[:,::-1].T 

# Finally convert to list if needed
data_bin_out = out.ravel().tolist()

运行时测试并验证输出 -

1) 设置输入:

In [2]: # Inputs
   ...: size = 4096
   ...: b0 = np.random.randint(2,9,(size))
   ...: b1 = np.random.randint(2,9,(size))
   ...: r0 = np.random.randint(2,9,(size))
   ...: g0 = np.random.randint(2,9,(size))
   ...: r1 = np.random.randint(2,9,(size))
   ...: g1 = np.random.randint(2,9,(size))
   ...: 

2) 定义方法-

def concat_app(b0,b1,r0,g0,r1,g1):
    out = np.zeros((size,8),dtype=b0.dtype)
    out[:,2:] = np.concatenate((b0,b1,r0,g0,r1,g1)).reshape(-1,size)[:,::-1].T 
    return out.ravel().tolist()

def org_app(b0,b1,r0,g0,r1,g1):
    data_bin = []
    counter = 0
    for x in range(size):
        counter += 1
        data_bin.insert(0, 0)
        data_bin.insert(1, 0)
        data_bin.insert(2, b0[x])
        data_bin.insert(3, b1[x])
        data_bin.insert(4, r0[x])
        data_bin.insert(5, g0[x])
        data_bin.insert(6, r1[x])
        data_bin.insert(7, g1[x])
    return data_bin

3) 时间和验证:

In [4]: %timeit org_app(b0,b1,r0,g0,r1,g1)
1 loops, best of 3: 556 ms per loop

In [5]: %timeit concat_app(b0,b1,r0,g0,r1,g1)
1000 loops, best of 3: 648 µs per loop

In [6]: concat_app(b0,b1,r0,g0,r1,g1) == org_app(b0,b1,r0,g0,r1,g1)
Out[6]: True