我真的不知道在执行一些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选择返回结果的格式是什么?
答案 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个或更多,那么它会更复杂。