1 回答
TA贡献1735条经验 获得超5个赞
最简单和最有效的方法是摆脱np.nonzero调用,并像在 Matlab 中一样使用逻辑索引。这是一个例子。(我正在使用相同形状的随机数据,仅供参考。)
>>> data = np.random.randn(5, 5000)
>>> start, end = -0.5, 0.5
>>> ioi = (data[0] > start) & (data[0] < end)
>>> print(ioi.shape)
(5000,)
>>> print(ioi.sum())
1900
>>> print(data[:, ioi].shape)
(5, 1900)
在np.nonzero通常不需要调用。就像Matlab的find功能一样,它比逻辑索引慢,通常一个人的目标可以通过逻辑索引更有效地完成。np.nonzero, 就像find, 应该主要仅在您需要实际索引值本身时使用。
正如您所怀疑的,额外维度的原因是元组的处理方式与 NumPy 中其他类型的索引数组不同。这是为了允许更灵活的索引,例如使用slices、省略号等。请参阅此有用页面以获取深入解释,尤其是最后一节。
至少还有两个其他选项可以解决这个问题。一种是使用ioi数组,从返回np.nonzero,直接为您只索引数据阵列。如:self.data_array[ioi]。你有一个额外维度的部分原因是你实际上在你的调用中有两组索引: slice ( :) 和 tuple ioi。np.nonzero正是由于这个原因,保证返回一个元组,因此它的输出总是可以用于直接索引源数组。
最后一个选项是调用np.squeeze返回的数组,但我会首先选择上述之一。
添加回答
举报