使用列表中的掩码值屏蔽python 2d数组
我有一个二维数组。我需要在数组中筛选具有特定索引值的行。这些值来自一个列表 这里有一个例子 我的数据:使用列表中的掩码值屏蔽python 2d数组,python,arrays,Python,Arrays,我有一个二维数组。我需要在数组中筛选具有特定索引值的行。这些值来自一个列表 这里有一个例子 我的数据: arr= [[ 1.681, 1.365, 0.105, 0.109, 0.50], [ 1.681, 1.365, 0.105, 0.109, 0.51], [ 1.681, 1.365, 0.105, 0.109, 0.52], [ 1.681, 1.365, 0.105, 0.109, 0.53], [ 1.681, 1.365, 0.10
arr= [[ 1.681, 1.365, 0.105, 0.109, 0.50],
[ 1.681, 1.365, 0.105, 0.109, 0.51],
[ 1.681, 1.365, 0.105, 0.109, 0.52],
[ 1.681, 1.365, 0.105, 0.109, 0.53],
[ 1.681, 1.365, 0.105, 0.109, 0.54],
[ 1.681, 1.365, 0.105, 0.109, 0.55],
[ 1.681, 1.365, 0.105, 0.109, 0.56],
[ 1.681, 1.365, 0.105, 0.109, 0.57],
[ 1.681, 1.365, 0.105, 0.109, 0.58],
[ 1.681, 1.365, 0.105, 0.109, 0.59],
[ 1.681, 1.365, 0.105, 0.109, 0.60]]
假设我想筛选最后一个条目来自列表0.5,0.55,0.6的行
我试着做了一个面具,如下所示:
>>> mask= arr['f4'] in [0.5, 0.55, 0.6]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: list indices must be integers, not str
>>> mask= arr['f4']==0.5 or arr['f4']==0.55 or arr['f4']==0.6
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: list indices must be integers, not str
>>>
非常感谢您的反馈
EDIT1:
有一个关于“f4”的问题。这似乎来自于我将数据从文件读入数组的方式
>>> arr= np.genfromtxt('data.rpt',dtype=None)
>>> arr
array([ ('tag', 1.681, 1.365, 0.105, 0.109, 0.5),
('tag', 1.681, 1.365, 0.105, 0.109, 0.51),
('tag', 1.681, 1.365, 0.105, 0.109, 0.52),
('tag', 1.681, 1.365, 0.105, 0.109, 0.53),
('tag', 1.681, 1.365, 0.105, 0.109, 0.54),
('tag', 1.681, 1.365, 0.105, 0.109, 0.55),
('tag', 1.681, 1.365, 0.105, 0.109, 0.56),
('tag', 1.681, 1.365, 0.105, 0.109, 0.57),
('tag', 1.681, 1.365, 0.105, 0.109, 0.58),
('tag', 1.681, 1.365, 0.105, 0.109, 0.59),
('tag', 1.681, 1.365, 0.105, 0.109, 0.6)],
dtype=[('f0', 'S837'), ('f1', '<f8'), ('f2', '<f8'), ('f3', '<f8'), ('f4', '<f8'), ('f5', '<f8')])
arr=np.genfromtxt('data.rpt',dtype=None)
>>>啊
数组([('tag',1.681,1.365,0.105,0.109,0.5),
(‘标签’、1.681、1.365、0.105、0.109、0.51),
(‘标签’、1.681、1.365、0.105、0.109、0.52),
(‘标签’、1.681、1.365、0.105、0.109、0.53),
(‘标签’、1.681、1.365、0.105、0.109、0.54),
(‘标签’、1.681、1.365、0.105、0.109、0.55),
(‘标签’、1.681、1.365、0.105、0.109、0.56),
(‘标签’、1.681、1.365、0.105、0.109、0.57),
(‘标签’、1.681、1.365、0.105、0.109、0.58),
(‘标签’、1.681、1.365、0.105、0.109、0.59),
("标签",1.681,1.365,0.105,0.109,0.6),,
dtype=[('f0','S837'),('f1','p>基本上来自
np.where
docs
import numpy as np
arr= np.array([[ 1.681, 1.365, 0.105, 0.109, 0.50],
[ 1.681, 1.365, 0.105, 0.109, 0.51],
[ 1.681, 1.365, 0.105, 0.109, 0.52],
[ 1.681, 1.365, 0.105, 0.109, 0.53],
[ 1.681, 1.365, 0.105, 0.109, 0.54],
[ 1.681, 1.365, 0.105, 0.109, 0.55],
[ 1.681, 1.365, 0.105, 0.109, 0.56],
[ 1.681, 1.365, 0.105, 0.109, 0.57],
[ 1.681, 1.365, 0.105, 0.109, 0.58],
[ 1.681, 1.365, 0.105, 0.109, 0.59],
[ 1.681, 1.365, 0.105, 0.109, 0.60]])
ix = np.isin(arr[:,-1], [0.5,0.55,0.6])
np.where(ix)
Out[107]: (array([ 0, 5, 10], dtype=int64),)
arr[np.where(ix),:]
Out[108]:
array([[[ 1.681, 1.365, 0.105, 0.109, 0.5 ],
[ 1.681, 1.365, 0.105, 0.109, 0.55 ],
[ 1.681, 1.365, 0.105, 0.109, 0.6 ]]])
对于矢量化方法,请尝试
numpy
:
import numpy as np
arr= [[ 1.681, 1.365, 0.105, 0.109, 0.50],
[ 1.681, 1.365, 0.105, 0.109, 0.51],
[ 1.681, 1.365, 0.105, 0.109, 0.52],
[ 1.681, 1.365, 0.105, 0.109, 0.53],
[ 1.681, 1.365, 0.105, 0.109, 0.54],
[ 1.681, 1.365, 0.105, 0.109, 0.55],
[ 1.681, 1.365, 0.105, 0.109, 0.56],
[ 1.681, 1.365, 0.105, 0.109, 0.57],
[ 1.681, 1.365, 0.105, 0.109, 0.58],
[ 1.681, 1.365, 0.105, 0.109, 0.59],
[ 1.681, 1.365, 0.105, 0.109, 0.60]]
arr = np.array(arr)
search = np.array([0.50, 0.55, 0.60])
arr[np.in1d(arr[:,-1], search)]
# array([[ 1.681, 1.365, 0.105, 0.109, 0.5 ],
# [ 1.681, 1.365, 0.105, 0.109, 0.55 ],
# [ 1.681, 1.365, 0.105, 0.109, 0.6 ]])
我希望这对更大的阵列更有效。您得到的答案是使用numpy,但是如果您不能使用numpy,这也可以工作 您可以使用列表理解(如@interent\u user said) 您也可以使用过滤器
masked_data = list(filter(lambda x: x[-1] in [0.5, 0.55, 0.6], arr)
[a代表arr中的a,如果a[-1]在[0.5,0.55,0.6]]
什么是f4
??我试过了,但没有成功:>>arr\u np=np.array(arr)>>search=np.array([0.50,0.55,0.60])>>search=np arr\u-np[0.50,0.55,0.60])>>索引器中的第1行:数组的索引太多>>
@GertGottschalk,我现在已经包含了我的完整代码。它可以在我的python 3.6/numpy 1.11上运行。
import numpy as np
arr= [[ 1.681, 1.365, 0.105, 0.109, 0.50],
[ 1.681, 1.365, 0.105, 0.109, 0.51],
[ 1.681, 1.365, 0.105, 0.109, 0.52],
[ 1.681, 1.365, 0.105, 0.109, 0.53],
[ 1.681, 1.365, 0.105, 0.109, 0.54],
[ 1.681, 1.365, 0.105, 0.109, 0.55],
[ 1.681, 1.365, 0.105, 0.109, 0.56],
[ 1.681, 1.365, 0.105, 0.109, 0.57],
[ 1.681, 1.365, 0.105, 0.109, 0.58],
[ 1.681, 1.365, 0.105, 0.109, 0.59],
[ 1.681, 1.365, 0.105, 0.109, 0.60]]
arr = np.array(arr)
search = np.array([0.50, 0.55, 0.60])
arr[np.in1d(arr[:,-1], search)]
# array([[ 1.681, 1.365, 0.105, 0.109, 0.5 ],
# [ 1.681, 1.365, 0.105, 0.109, 0.55 ],
# [ 1.681, 1.365, 0.105, 0.109, 0.6 ]])
masked_data = [ x for x in arr if x[-1] in [0.5, 0.55, 0.6] ]
masked_data = list(filter(lambda x: x[-1] in [0.5, 0.55, 0.6], arr)
arr= np.array([[ 1.681, 1.365, 0.105, 0.109, 0.50],
[ 1.681, 1.365, 0.105, 0.109, 0.51],
[ 1.681, 1.365, 0.105, 0.109, 0.52],
[ 1.681, 1.365, 0.105, 0.109, 0.53],
[ 1.681, 1.365, 0.105, 0.109, 0.54],
[ 1.681, 1.365, 0.105, 0.109, 0.55],
[ 1.681, 1.365, 0.105, 0.109, 0.56],
[ 1.681, 1.365, 0.105, 0.109, 0.57],
[ 1.681, 1.365, 0.105, 0.109, 0.58],
[ 1.681, 1.365, 0.105, 0.109, 0.59],
[ 1.681, 1.365, 0.105, 0.109, 0.60]])
mask=[.5,.6,.55]
arr_mask = np.array([x for x in arr if sum(np.isin(a,mask))])