我有像这样的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方式都是我的好奇心。性能提升也会非常好!
答案 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]])