将多个 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
我有六个 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