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

3

我有一个现成的numpy数组(uint8),它长这样:

(值是8位的,我只对最后3个数字感兴趣)

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

最终,我希望数据呈现如下格式:
[01AAABBB, 01CCCDDD 01EEEFFF, 01GGGHHH, 01IIIJJJ, 01KKKLLL]

另外,每隔一行需要翻转。

目前,我有一段冗长而曲折的代码,按行和单元格迭代原始列表,移动并添加数据,但这并不够高效。

是否有解决这个问题的好方法?


输入数组的形状总是(4, 3)吗? - Warren Weckesser
不,但实际问题的形状始终为(100,300)。 - zidik
确定一下:您需要一个新的数组,其中每个元素是一个奇数元素和1000乘以偶数元素的组合,加上01000000;并且解析顺序是“上下”,穿过原始数组? - mdurant
也许,你应该考虑使用C/Fortran编写一个库。 - Stefan
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)

1
简单明了,加一。奇数行反转可以更高效地完成,如arr[1::2] = arr[1::2, ::-1]。我可能会添加一个arr &= 0x7来确保仅使用3个最低有效位,但这可能过于谨慎了。 - Jaime
由于某些原因,我无法让原地反转工作,每个反转行的最后一个元素被设置为第一个...例如:对于输入[[1, 2, 3], [4, 5, 6]],我得到的是[[1, 2, 3],[6, 5, 4]]。很奇怪。 - Pokey McPokerson
1
反转是就地进行的,因此在反转过程中会覆盖数据。如果您将相同的语法用于不同的数组,它也可以工作。 - mdurant
1
谢谢!问题解决了! 该对中的第一个应该被移动。 (unsnaked_array [:: 2] << 3)+ unsnaked_array [1 :: 2] 我刚刚用5行代码替换了20行丑陋的代码。 - zidik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接