【问题标题】:Squeezing a numpy array挤压一个numpy数组
【发布时间】:2016-12-29 19:38:19
【问题描述】:

这是我打算做的一个例子。我有输入数据,如下所示:

data = array([0,1,2,3,4,5,6,7,8,9])

我需要做的是总结前两个值,然后是接下来的两个值,依此类推。所以结果应该如下。

result = array([1,5,9,13,17])

这就是我所说的“挤压”

我有一个大小为 4096 的 numpy 数组。我需要将数组压缩到 2048,1024 或 512 的大小。 它实际上是能谱,其中阵列的索引给出了 ADC 通道号。该值给出光子计数。 为此,这就是我所做的。

 # tdspec is input array of size 4096
 spec_bin_size = 1024
 spect = n.zeros(spec_bin_size)
 i = 0
 j=0
 interval = 4096/spec_bin_size
 while j < spec_bin_size:
     a = n.sum(tdspec[i:i+interval])
     spect[j] = a
     i = i+interval
     j = j+1

效果很好,但现在我需要在多个光谱上运行这个循环,我担心它会很慢。 谁能告诉我是否有一个 numpy/scipy 操作可以做到这一点?

【问题讨论】:

  • FWIW,numpy 和 scipy 中使用的“squeeze”一词往往表示“尺寸为 1 的条带尺寸”,因此 np.array([[[1, 2, 3, 4]]]) 被压缩为 np.array([1, 2, 3, 4])
  • 谢谢你的信息你能告诉我问题中提到的操作应该叫什么吗?
  • “sum-pooling”或“binning”可能是一个更好的词

标签: numpy scipy binning


【解决方案1】:

让我们定义你的数组:

>>> import numpy as np
>>> data = np.array([0,1,2,3,4,5,6,7,8,9])

如愿以偿:

>>> np.sum(data.reshape(5, 2), axis=1)
array([ 1,  5,  9, 13, 17])

或者,如果我们想要 reshape 为我们计算其中一个维度,请为该维度指定 -1

>>> np.sum(data.reshape(-1, 2), axis=1)
array([ 1,  5,  9, 13, 17])

>>> np.sum(data.reshape(5, -1), axis=1)
array([ 1,  5,  9, 13, 17])

使用 scipy

Scipy 有多种可用的。模拟上面的过滤器,例如:

>>> import scipy.ndimage.filters as filters
>>> filters.convolve1d(data, [1,1])
array([ 1,  3,  5,  7,  9, 11, 13, 15, 17, 18])

或者,只选择所有其他元素以获得先前的结果:

>>> filters.convolve1d(data, [1,1])[::2]
array([ 1,  5,  9, 13, 17])

有关其他过滤器,请参阅scipy.ndimage.filters

您使用的顶帽过滤器可能会导致虚假伪影。高斯滤波器通常是更好的选择。

【讨论】:

  • 这就是我想要的。谢谢!但是,如果我们输入 -1 而不是 5,我们可以在每次需要更改要汇总的元素数量时摆脱处理数字(这里是 2。在我的情况下:512,1024 或 2048)我得到了这个信息从以下问题的答案:stackoverflow.com/questions/21921178/binning-a-numpy-array
  • @John1024:是的,但正如@Ishan 正确指出的那样,如果您这样做.reshape(-1, n),numpy 将为您计算 4096 / n
  • filters.convolve1d 也可以只拼写np.convolve
  • Ishan,这是一个很好的发现:答案已更新。 @Eric,是的,convolve 和 convolve1d 仅在多维数组上有所不同。
  • @John1024:这是真的吗?我认为他们只是在处理 mode 参数方面有所不同
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-08
  • 1970-01-01
  • 1970-01-01
  • 2012-06-05
  • 2018-11-03
相关资源
最近更新 更多