[英]numpy python - slicing rows and columns at the same time
我有一个 130 X 13 的 numpy 矩阵。假设我想 select 一组满足条件的特定行和列的子集-
trainx[trainy==label,[0,6]]
上面的代码不起作用并引发错误 - IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (43,) (2,).
但是,如果我分两步进行 - 首先是子集行,然后是列,它可以工作。 是不是有些奇怪或 numpy 以这种方式工作?
temp1 = trainx[trainy==label,:]
temp1 = temp1[:,[0,6]]
您可以简单地将索引链接起来
trainx[trainy==label][:, [0,6]]
可运行示例
arr = np.random.rand(130,13)
arr[arr[:,0]>0.5][:, [0,6]]
In [154]: x = np.arange(24).reshape(6,4)
In [155]: mask = np.array([1,0,1,0,1,0],bool)
使用您的两步方法:
In [156]: x[mask] # x[mask, :]
Out[156]:
array([[ 0, 1, 2, 3],
[ 8, 9, 10, 11],
[16, 17, 18, 19]])
In [157]: x[mask][:,[1,3]]
Out[157]:
array([[ 1, 3],
[ 9, 11],
[17, 19]])
或者这两个索引可以与ix_
结合使用:
In [158]: np.ix_(mask, [1,3])
Out[158]:
(array([[0],
[2],
[4]]), array([[1, 3]]))
In [159]: x[np.ix_(mask, [1,3])]
Out[159]:
array([[ 1, 3],
[ 9, 11],
[17, 19]])
请注意, Out[158]
中的第一个数组是np.nonzero(mask)[0][:,None]
,即列向量形式的非零索引。 该 (3,1) 索引数组可以与 (2,) 列数组一起广播到 select 一个 (3,2) 元素数组。 或者在您的示例中为 (43,2) 数组。
boolean mask
不能转为 (6,1) 数组并用于掩码x
; 这只有在变成 (6,4) 掩码时才有效,与x
的形状相匹配。
所以要么使用两步索引,要么使用ix_
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.