我有一个包含一些数据的csv文件,这里有一个示例:
Alcohol,Malice acid,Ash,Alcalinity of ash,Magnesium,Total phenols,Flavanoids,Nonflavanoid phenols,Proanthocyanins,Color intensity,Hue,OD280/OD315 of diluted wines,Proline
1,14.23,1.71,2.43,15.6,127,2.8,3.06,0.28,2.29,5.64,1.04,3.92
1,13.2,1.78,2.14,11.2,100,2.65,2.76,0.26,1.28,4.38,1.05,3.4
1,13.16,2.36,2.67,18.6,101,2.8,3.24,0.3,2.81,5.68,1.03,3.17
我读了我的csv文件并将数组转换为3个numpy数组:
wine_data_file = open("wine.csv","r")
wine_data_reader = csv.reader(wine_data_file, delimiter=",")
wine_data = []
wine_labels = []
wine_columns = []
#Read each line of wine.csv
count = 0
for row in wine_data_reader:
if count <= 0:
wine_columns += [row[1:]]
else:
wine_labels += [int(row[0])]
wine_data += [map(float,row[1:])]
count = count + 1
wine_data = np.array(wine_data,dtype=float)
wine_labels = np.array(wine_labels)
wine_columns = np.array(wine_columns)
这些numpy数组将保存列标题,标签(每行的第一个数字)和数据。
我可以打印此结果:
print wine_data[wine_labels == 1]
哪个会让我在wine_data中的每一行都有一个标签(酒精)为1.但是我无法对此做同样的事情:
print wine_data[wine_columns == "Hue"]
我的问题是,如何才能在Hue的numpy数组中获得每个索引。
期望的结果:
[[5.64],[4.38],[5.68]]
答案 0 :(得分:1)
数据是二维的,您将布尔索引应用于第一维。相反,您希望将其应用于第二维......
#columns ----------|
#rows-----| |
# V V
wine_data[:,wine_columns == 'Hue']
答案 1 :(得分:1)
让我们首先考虑为什么
print wine_data[wine_labels == 1]
的工作原理。 wine_labels == 1
评估为[ True True True]
,这意味着您选择了wine_data
数组中三行中的每一行。
当您尝试评估时
print wine_data[wine_columns == "Hue"]
然后过滤器wine_columns == "Hue"
评估为[[False False False False False False False False False True False False]]
。注意双括号:wine_columns
是一个二维数组,有一行和12列。这使得将它用作wine_data
数组的选择器变得棘手。
所以让我们使这个数组成为一维的:(wine_columns == "Hue")[0]
是[False False False False False False False False False True False False]
。现在我们想将它用作wine_data
中列的选择器,我们还想要任何行:
print wine_data[:,(wine_columns == "Hue")[0]]
给出
[[ 5.64], [ 4.38], [ 5.68]]
这是你想要的,但请记住它仍然是一个二维数组(3行,1列)。