为了账号安全,请及时绑定邮箱和手机立即绑定

过滤后的 Numpy 数组更改维数

过滤后的 Numpy 数组更改维数

牧羊人nacy 2021-09-28 17:49:31
我无法习惯 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) 的数组形状?
查看完整描述

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返回的数组,但我会首先选择上述之一。


查看完整回答
反对 回复 2021-09-28
  • 1 回答
  • 0 关注
  • 157 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信