问题描述
假设我有一个包含2行10列的numpy数组。我想在第一行中选择具有偶数值的列。我想要的结果如下:
a = list(range(10))
b = list(reversed(range(10)))
c = np.concatenate([a,b]).reshape(2,10).T
c[c[:,0] % 2 == 0].T
但是,此方法转置两次,我不认为它是非常pythonic的。有没有办法做同样的工作清洁器?
解决方法
Numpy允许您分别沿每个维度进行选择。您传入长度为维数的索引元组。
说你的数组是
a = np.random.randint(10,size=(2,10))
第一行中的偶数元素由掩码给出
m = (a[0,:] % 2 == 0)
您可以使用a[0]
而不是a[0,:]
来获取第一行,因为丢失的索引与切片:
同义(获取所有内容)。
现在,您可以将蒙版仅应用于 second 维度:
result = a[:,m]
您还可以先将掩码转换为索引。两种方法之间存在细微的差异,在这种简单情况下您不会看到。最大的不同通常是线性索引要快一些,尤其是如果多次应用:
i = np.flatnonzero(m)
result = a[:,i]