我有一个问题是大多数人似乎想要的倒退。我正在使用numpy数组,我必须处理数据采集系统中的硬件错误。我的数据以成对的uint16形式出现,需要分成2个数组。现在,这就是我正在做的事情:
ql = open('/dev/quicklogic', 'rb')
self.rawData = numpy.fromfile(ql, numpy.uint16, 50000) # grab 50k integers
self.rawFlour = self.rawData[0::2] # deinterlace the array
self.rawScatter = self.rawData[1::2]
因此,将数组拆分为两个数据流非常有效,但设备每17次读取时会发送一对0。
使用除了每17次读取构建一对数组的最有效方法是什么? (注意,我也可以将它应用于rawData数组而不是两个拆分数组)
答案 0 :(得分:2)
假设您的数组大小是17的倍数。您可以使用reshape:
import numpy as np
a = np.arange(17*2)
print a
"""
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
25 26 27 28 29 30 31 32 33]
"""
a = a.reshape(a.size // 17, 17)
print a
"""
[[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16]
[17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33]]
"""
a = a[:, :-1]
print a
"""
[[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15]
[17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32]]
"""
a = a.ravel()
print a
"""
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 17 18 19 20 21 22 23 24 25
26 27 28 29 30 31 32]
"""
答案 1 :(得分:2)
您可以使用整个数组进行列表切片,并使用retroactivly删除每个第17个元素。
>>> x = range(10)
>>> del x[::4]
>>> x
[1, 2, 3, 5, 6, 7, 9]
正如您所看到的,这将从元素0开始删除每个第4个元素。如果您想保留第一个元素,则可以执行此操作:
>>> x = range(10)
>>> del x[3::4]
>>> x
[0, 1, 2, 4, 5, 6, 8, 9]
答案 2 :(得分:1)
您可以按如下方式使用列表推导:
>>> n = 17
>>> mylist = range(1, 100)
>>> new_list = [mylist[i] for i in range(len(mylist)) if i % n != n-1]
>>> new_list
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
>>>
这将删除(1, 100)
范围内的每个n th 项,基本上所有数字都以1开头并以99结尾。
答案 3 :(得分:1)
这里使用列表理解(i
是索引):
>>> a = range(1,100)
>>> a = [x for x in (x for i,x in enumerate(a) if (i+1)%17 != 0)]
>>> a
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
基本思想是跳过每17个i
,这是通过跳过满足(i+1)%17
的索引来完成的,因为python使用0索引。