numpy为相同的代码返回1d数组和2d数组

时间:2016-03-31 04:31:54

标签: python arrays numpy

我真的不知道在执行一些2d数组操作时numpy遵循哪些规则关于将结果作为1d或2d数组返回。让我们考虑以下代码

idx_cls_samples = sample_data[:, -1] == c
v_feature = sample_data[idx_cls_samples, f]

f_values = sample_data[[sample_data[:, -1] == c], f]

请注意,最后一行只是前两行合并为一行。

前两行的结果是形式数组([1,2,3,...])的numpy向量,最后一行的结果是数组([[1,2,3,... ]])我认为结果应该是数组([1],[2],[3],......])。我怎样才能预先知道numpy选择返回结果的格式是什么?

2 个答案:

答案 0 :(得分:2)

  

请注意,最后一行只是前两行合并为一行。

不,不是。你在那里插了一对括号:

f_values = sample_data[[sample_data[:, -1] == c], f]
#                      ^                       ^

带他们出去。

至于索引规则,这些规则在documentation中。他们很长。

答案 1 :(得分:0)

sample_data是2d。 sample_data[:,-1]是1d,最后一列。使用标量进行索引会删除维度。

...=c生成相同维度的布尔值(1d)。

sample_data[:, f]也是1d,fth列。

使用布尔数组索引返回布尔值相同维度的结果,但只返回值的子集

sample_data[idx, f]为1d,sample_data[[idx], f]为2d(由于添加了[])。

你可能想要,sample_data[(sample_data[:, -1] == c), f],其中()只是对字符串进行分组,有时候是为了运算符优先级,有时只是为了使其更具可读性。 (但要注意(...,),这会产生一个元组。)

sample_data[idx, [f]]会为您提供列'向量',2d为1列。

查看sample_data[idx,f]的另一种方法是:idx选择行的子集,f从该第2天中选择一列。

通常可以逐轴研究2d(或更高的nd)索引;索引特别适用于标量或切片。如果索引是列表或数组,或者更糟的是2个或更多,那么它会更复杂。