高效从现有数组创建新numpy数组

3 投票
1 回答
1328 浏览
提问于 2025-04-18 14:56

我有一个现成的numpy数组(uint8),它看起来是这样的:

(这些值是8位的,我只对最后3位感兴趣)

[
    [ 00000AAA, 00000BBB, 00000CCC ],
    [ 00000FFF, 00000EEE, 00000DDD ],
    [ 00000GGG, 00000HHH, 00000III ],
    [ 00000LLL, 00000KKK, 00000JJJ ]
]

最后,我希望数据能变成这个样子:

[01AAABBB, 01CCCDDD 01EEEFFF, 01GGGHHH, 01IIIJJJ, 01KKKLLL]

另外,每隔一行的数据是反转的。

现在我有一段很长很复杂的代码,它逐行逐列地遍历原始列表,移动和添加数据,但这样效率不够高。

有没有什么好的高效的方法来解决这个问题呢?

1 个回答

5

这里有一种方法,使用了Numpy自带的命令和向量风格的索引,所以代码写得比较简洁(而且应该比逐个循环要快):

根据评论中的建议进行了更新

# Reverse direction of every second row
unsnaked_array       = np.array(inp_array)
unsnaked_array[1::2] = inp_array[1::2, ::-1]

# Change to one long array
unsnaked_array = unsnaked_array.ravel()
unsnaked_array &= 0x7    # Extra safety :)    

# Sum every pair of elements (with first element rolled) and add required bit
result_array = (unsnaked_array[::2]<<3) + unsnaked_array[1::2] + (1<<6)

撰写回答