我使用numpy.genfromtxt
读取了以下对象:
A = [(4, 'A', 3750.5),
(4, 'B', 3252.6),
(8, 'A', 3350.5),
(8, 'B', 3152.6)]
我想对它进行numpy花式索引,但我不能,因为这不是一个numpy数组。这是一个列表数组。
获取第一列中包含'4'的所有行的第3列的最佳方法是什么?
我尝试了A[A[:,0]==4]
,但解释器抱怨“IndexError:invalid index”。
编辑:
这是我正在使用的python程序:
import numpy as np
A = np.genfromtxt( "text.txt" , dtype=( int , "|S10", float))
A_array = np.asarray(A, dtype=object)
print A
print A_array
文件text.txt
:
4 A 3750.5
4 B 3270.5
8 A 3480.5
8 B 3590.5
这是输出:
[(4, 'A', 3750.5) (4, 'B', 3270.5) (8, 'A', 3480.5) (8, 'B', 3590.5)]
[(4, 'A', 3750.5) (4, 'B', 3270.5) (8, 'A', 3480.5) (8, 'B', 3590.5)]
我在这里缺少什么?
答案 0 :(得分:4)
In [24]: A_array = numpy.asarray(A, dtype=object)
In [25]: A_array[A_array[:,0] == 4]
Out[25]:
array([[4, A, 3750.5],
[4, B, 3252.6]], dtype=object)
如果数据列具有您想要跟踪的语义含义,请考虑将元组列表直接加载到Pandas DataFrame并为其提供列标签。逻辑索引的工作方式类似:
In [27]: A_df = pandas.DataFrame(A, columns=['Col1', 'Col2', 'Col3'])
In [28]: A_df
Out[28]:
Col1 Col2 Col3
0 4 A 3750.5
1 4 B 3252.6
2 8 A 3350.5
3 8 B 3152.6
In [29]: A_df.Col1 == 4
Out[29]:
0 True
1 True
2 False
3 False
Name: Col1
In [30]: A_df[A_df.Col1 == 4]
Out[30]:
Col1 Col2 Col3
0 4 A 3750.5
1 4 B 3252.6
答案 1 :(得分:2)
首先,A
中的列表元素之间需要逗号,否则会出现语法错误:
A = [(4, 'A', 3750.5),
(4, 'B', 3252.6),
(8, 'A', 3350.5),
(8, 'B', 3152.6)]
接下来,您可以使用list comprehension非常简洁地获得您想要的内容:
[ row[2] for row in A if row[0] == 4 ]
结果:
[3750.5, 3252.6]