使用包含多个类型的数据进行数组切片

时间:2013-11-15 21:01:46

标签: python arrays numpy

我使用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)]

我在这里缺少什么?

2 个答案:

答案 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]