猿问

过滤后的 Numpy 数组更改维数

我无法习惯 Numpy 数组(我是 Matlab 用户)。当我尝试从数组中只选择一个值范围时,我看到结果数组有一个额外的维度:


    ioi = np.nonzero((self.data_array[0,:] >= range_start) & (self.data_array[0,:] <= range_end))


    print("self.data_array.shape = {0}".format(self.data_array.shape))

    print("self.data_array.shape[:,ioi] = {0}".format(self.data_array[:,ioi].shape))

结果是:


self.data_array.shape = (5, 50000)

self.data_array.shape[:,ioi] = (5, 1, 408)

我还看到 ioi 是一个元组。不知道跟这个有没有关系。


这里发生了什么来创建额外的维度,我应该怎么做,以最直接的方式,在这种情况下获得 (5,408) 的数组形状?


牧羊人nacy
浏览 158回答 1
1回答

喵喔喔

最简单和最有效的方法是摆脱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返回的数组,但我会首先选择上述之一。
随时随地看视频慕课网APP

相关分类

Python
我要回答