重复提取数组的一部分

时间:2019-04-29 09:17:25

标签: python python-3.x

我有一个数组:

[a1, b1, c1, d1, a2, b2, c2, d2, a3, b3, etc]

如何选择不带for循环的每个b和c?我可以使用切片或其他任何方法吗?

结果数组应如下所示:

[b1, c1, b2, c2, b3, c3, etc]

3 个答案:

答案 0 :(得分:6)

您可以使用遮罩。如果输入数组的长度始终为4的倍数,则可以创建模式False, True, True, False的掩码。我以字符串输入为例。

arr = np.array(['a1', 'b1', 'c1', 'd1', 'a2', 'b2', 'c2', 'd2', 'a3', 'b3', 'c3', 'd3'], dtype='str')
mask = [False, True, True, False]*int(len(arr)/4)

print (arr[mask])
# array(['b1', 'c1', 'b2', 'c2', 'b3', 'c3'])

答案 1 :(得分:1)

您可以使用numpy.lib.stride_tricks.as_strided选择所需的数据:

import numpy as np
from numpy.lib.stride_tricks import as_strided

data = np.array(['a0', 'b0', 'c0', 'd0', 'a1', 'b1', 'c1', 'd1', 'a2', 'b2', 'c2', 'd2'])
s = data.strides[0]
# No data is copied
data2 = as_strided(data[1:], shape=(data.size // 4, 2), strides=(4 * s, s), writeable=False)
print(data2)
# [['b0' 'c0']
#  ['b1' 'c1']
#  ['b2' 'c2']]
data3 = data2.ravel()  # This causes a copy
print(data3)
#['b0' 'c0' 'b1' 'c1' 'b2' 'c2']

答案 2 :(得分:1)

您还可以使用filtermap

l = ['a1', 'b1', 'c1', 'd1', 'a2', 'b2', 'c2', 'd2', 'a3', 'b3']
newlist = list(filter(lambda x: x[0] % 4 == 1 or x[0] % 4 == 2, enumerate(l)))
newlist = list(map(lambda x: x[1], newlist))
print(newlist)

如果它们是字符串,则filter就足够了

l = ['a1', 'b1', 'c1', 'd1', 'a2', 'b2', 'c2', 'd2', 'a3', 'b3']
newlist = list(filter(lambda x: 'b' in x or 'c'in x, l))
print(newlist)