将numpy数组的块转换为元组

时间:2018-02-11 13:21:21

标签: python arrays python-3.x numpy

我有像这样的numpy数组

array([[243],
       [243],
       [243],
       [243],
       [243],
       [243],
       [243],
       [245],
       [244],
       [244],
       [244],
       [243],

并且它的每三个元素都将被转换为元组!我写过这样一个简单的生成器,

def RGBchunks(a_list):
    for i in range(0,len(a_list),3):
        temp = []
        for j in range(3):
            temp.extend(a_list[i+j])
        yield tuple(temp)

这给了我想要的东西,比如这个,

>>> for i in RGBchunks(my_arr):
         print(i)


(243, 243, 243)
(243, 243, 243)
(243, 243, 243)
(244, 244, 244)
(245, 245, 245)
(244, ........
..............
(243, 243, 243)

我很好奇,知道是否有一些简单优雅的方式在numpy中做到这一点!可能所有那些元组都在新的列表中?任何Pythonic方式都是我的好奇心。性能提升也会非常好!

1 个答案:

答案 0 :(得分:1)

如果它是一个没有任何重叠的简单重塑操作,请使用reshape

my_arr.reshape(-1, 3)

或者,

np.reshape(my_arr, (-1, 3))

array([[243, 243, 243],
       [243, 243, 243],
       [243, 245, 244],
       [244, 244, 243]])

如果你真的想要一个元组列表,请在重新整形的结果上调用map

list(map(tuple, my_arr.reshape(-1, 3)))

或者,通过列表理解性能:

[tuple(x) for x in my_arr.reshape(-1, 3)]

[(243, 243, 243), (243, 243, 243), (243, 245, 244), (244, 244, 243)]

对于重叠步幅,有stride_tricks

f = np.lib.stride_tricks.as_strided
n = 3

f(my_arr, shape=(my_arr.shape[0] - (n + 1), n), strides=my_arr.strides)

array([[243, 243, 243],
       [243, 243, 243],
       [243, 243, 243],
       [243, 243, 243],
       [243, 243, 243],
       [243, 243, 245],
       [243, 245, 244],
       [245, 244, 244],
       [244, 244, 244],
       [244, 244, 243]])