我有一个数组:
[a1, b1, c1, d1, a2, b2, c2, d2, a3, b3, etc]
如何选择不带for循环的每个b和c?我可以使用切片或其他任何方法吗?
结果数组应如下所示:
[b1, c1, b2, c2, b3, c3, etc]
答案 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)
您还可以使用filter
和map
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)