首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >让我们为python的numpy做一个N维像素绑定/存储的参考实现。

让我们为python的numpy做一个N维像素绑定/存储的参考实现。
EN

Stack Overflow用户
提问于 2016-03-28 19:21:00
回答 3查看 466关注 0票数 3

我经常想要像素桶/像素桶一个numpy数组,这意味着,用单个像素替换N连续像素组,这是N替换像素的总和。例如,从值开始:

代码语言:javascript
复制
x = np.array([1, 3, 7, 3, 2, 9])

如果桶大小为2,则转换为:

代码语言:javascript
复制
bucket(x, bucket_size=2) 
= [1+3, 7+3, 2+9]
= [4, 10, 11]

据我所知,没有numpy函数专门这样做(如果我错了,请纠正我),所以我经常使用自己的函数。对于一维numpy数组,这并不坏:

代码语言:javascript
复制
import numpy as np

def bucket(x, bucket_size):
    return x.reshape(x.size // bucket_size, bucket_size).sum(axis=1)

bucket_me = np.array([3, 4, 5, 5, 1, 3, 2, 3])
print(bucket(bucket_me, bucket_size=2)) #[ 7 10  4  5]

...however,我很容易被多维案例弄糊涂了,最后我一次又一次地把我自己的“容易”问题的解决方案翻了个底朝天。如果我们能建立一个很好的N维参考实现,我会很高兴的。

  • 最好是函数调用允许沿不同的轴(可能类似于bucket(x, bucket_size=(2, 2, 3)))的不同的bin大小。
  • 最好是解决方案是合理有效的(整形和和是相当快的,在坎皮)
  • 当数组没有很好地划分为整数个桶数时,处理边缘效果的加成点。
  • 允许用户选择初始边沿偏移量的加成点。

正如Divakar所建议的,下面是我想要的2-D示例中的行为:

代码语言:javascript
复制
x = np.array([[1, 2, 3, 4],
              [2, 3, 7, 9],
              [8, 9, 1, 0],
              [0, 0, 3, 4]])

bucket(x, bucket_size=(2, 2))
= [[1 + 2 + 2 + 3, 3 + 4 + 7 + 9],
   [8 + 9 + 0 + 0, 1 + 0 + 3 + 4]]
= [[8, 23],
   [17, 8]]

...hopefully我的算术做得很正确;)

EN

Stack Overflow用户

发布于 2016-03-28 20:02:47

要为ndarray案例的每个轴指定不同的装箱大小,可以在每个轴上迭代地使用np.add.reduceat,如下所示-

代码语言:javascript
复制
def bucket(x, bin_size):
    ndims = x.ndim
    out = x.copy()
    for i in range(ndims):
        idx = np.append(0,np.cumsum(bin_size[i][:-1]))
        out = np.add.reduceat(out,idx,axis=i)
    return out

样本运行-

代码语言:javascript
复制
In [126]: x
Out[126]: 
array([[165, 107, 133,  82, 199],
       [ 35, 138,  91, 100, 207],
       [ 75,  99,  40, 240, 208],
       [166, 171,  78,   7, 141]])

In [127]: bucket(x, bin_size = [[2, 2],[3, 2]])
Out[127]: 
array([[669, 588],
       [629, 596]])

#  [2, 2] are the bin sizes along axis=0
#  [3, 2] are the bin sizes along axis=1

# array([[165, 107, 133, | 82, 199],
#        [ 35, 138,  91, | 100, 207],
# -------------------------------------
#        [ 75,  99, 40,  | 240, 208],
#        [166, 171, 78,  | 7, 141]])

In [128]: x[:2,:3].sum()
Out[128]: 669

In [129]: x[:2,3:].sum()
Out[129]: 588

In [130]: x[2:,:3].sum()
Out[130]: 629

In [131]: x[2:,3:].sum()
Out[131]: 596
票数 1
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36269508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档