如何使用numpy来分割矩阵,避免嵌套的for循环?



如果我通过避免嵌套的for循环而使用numpy-functions来转换下面的函数,我的代码可以运行得更快。输入是一个numpy矩阵,形状为(8,96,3),根据两个(行,颜色,RGB-color)。输出需要3个数组,每个数组代表一个led矩阵。led矩阵以蛇形的方式组织(在Github上找到):

x - x - x - x - x - x - x --- to raspberry pi
|
|
x - x - x - x - x - x - x 
|
|
x - x - x - x - x - x - x 
|
|
x - x - x - x - x - x - x 
|
|
x - x - x - x - x - x - x 

将矩阵分成这3个数组的代码如下:

def matrix_to_array(self, matrix):
arr1 = []
arr2 = []
arr3 = []
rows = len(matrix)
cols = len(matrix[0])
for r in range(rows):
for c in range(cols):
c = 95 - c          
if c <= 31:
if r % 2 == 1:
arr1.append(matrix[7-r][31-c])
else:
arr1.append(matrix[7-r][c])
elif c <= 63:
if r % 2 == 1:
arr2.append(matrix[7-r][31-c+64])
else:
arr2.append(matrix[7-r][c])                 
else:
if r % 2 == 1:
arr3.append(matrix[7-r][63-c])
else:
arr3.append(matrix[7-r][c])
return arr3+arr2+arr1

现在,如何使用numpy优化这一点,但仍然保持led矩阵设置所需的转换?非常感谢你的帮助!

这段代码给出了与您的代码完全相同的结果…但是没有列循环。

def matrix_to_array(self, matrix):
arr1 = []
arr2 = []
arr3 = []
for r in range(0, len(matrix), 2):
arr1 += list(np.concatenate((matrix[-r - 1, :32][::-1], matrix[-r - 2, :32])))
arr2 += list(np.concatenate((matrix[-r - 1, 32:64][::-1], matrix[-r - 2, 32:64])))
arr3 += list(np.concatenate((matrix[-r - 1, 64:][::-1], matrix[-r - 2, 64:])))
return arr3 + arr2 + arr1

老实说,这是编程学校的练习吗?感觉就像……

有趣的解决:)

编辑:下面是核心版本:D

没有更多的循环,只是优化了numpy,你应该去掉最后的列表转换…如果你想用它做什么,它肯定是没用的……

def matrix_to_array(self, matrix):
mask = np.array([
i if i//32 % 2 == 0 else (i//32 + 1)*32 - i % 32 - 1 
for i in range(32*len(matrix))
])
return list(np.concatenate((
matrix[:, 64:].reshape((-1, ))[::-1][mask],
matrix[:, 32:64].reshape((-1, ))[::-1][mask], 
matrix[:, :32].reshape((-1, ))[::-1][mask]
)))

最新更新