我们来为python的numpy做一个N维像素分箱/分桶的参考实现

2024-02-24

我经常想要像素仓/像素桶 https://en.wikipedia.org/wiki/Data_binning一个 numpy 数组,意思是,替换组N具有单个像素的连续像素,它是各个像素的总和N替换的像素。例如,从以下值开始:

x = np.array([1, 3, 7, 3, 2, 9])

当桶大小为 2 时,这会转换为:

bucket(x, bucket_size=2) 
= [1+3, 7+3, 2+9]
= [4, 10, 11]

据我所知,没有 numpy 函数专门执行此操作(如果我错了,请纠正我!),所以我经常推出自己的函数。对于一维 numpy 数组,这还不错:

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]

...然而,我很容易对多维情况感到困惑,最终我一遍又一遍地用自己的有缺陷的、半途而废的解决方案来解决这个“简单”的问题。如果我们能够建立一个很好的 N 维参考实现,我会很高兴。

  • 最好,函数调用允许沿不同轴使用不同的 bin 大小(可能类似于bucket(x, bucket_size=(2, 2, 3)))

  • 最好的解决方案是相当有效的(在 numpy 中重塑和求和相当快)

  • 当数组不能很好地划分为整数个桶时,处理边缘效应的奖励点。

  • 允许用户选择初始箱边缘偏移的奖励积分。

正如 Divakar 所建议的,这是我在示例 2-D 案例中期望的行为:

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]]

...希望我的算术正确;)


我认为你可以用 skimage 完成大部分繁琐的工作view_as_blocks http://scikit-image.org/docs/dev/api/skimage.util.html#skimage.util.view_as_blocks。这个函数是实施使用as_strided https://github.com/scikit-image/scikit-image/blob/master/skimage/util/shape.py#l10所以它非常有效(它只是改变步幅信息来重塑数组)。因为它是用 Python/NumPy 编写的,所以如果您没有安装 skimage,您可以随时复制代码。

应用该函数后,您只需对重构数组的 N 个尾轴求和(其中 N 是数组的长度)bucket_size元组)。这是一个新的bucket()功能:

from skimage.util import view_as_blocks

def bucket(x, bucket_size):
    blocks = view_as_blocks(x, bucket_size)
    tup = tuple(range(-len(bucket_size), 0))
    return blocks.sum(axis=tup)

那么例如:

>>> x = np.array([1, 3, 7, 3, 2, 9])
>>> bucket(x, bucket_size=(2,))
array([ 4, 10, 11])

>>> 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))
array([[ 8, 23],
       [17,  8]])

>>> y = np.arange(6*6*6).reshape(6,6,6)
>>> bucket(y, bucket_size=(2, 2, 3))
array([[[ 264,  300],
        [ 408,  444],
        [ 552,  588]],

       [[1128, 1164],
        [1272, 1308],
        [1416, 1452]],

       [[1992, 2028],
        [2136, 2172],
        [2280, 2316]]])
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我们来为python的numpy做一个N维像素分箱/分桶的参考实现 的相关文章

随机推荐

  • Python 和“re”

    我在 python 中关于 Regex 的教程解释了如何在 python 中使用 re 模块 我想从 A 标签中获取 URL 因此知道 Regex 我编写了正确的表达式 并在我选择的正则表达式测试应用程序中对其进行了测试并确保它工作了 当放
  • 如何在 OSX Catalina (10.15) 中使用 Wireshark 捕获 USB 流量

    我正在尝试让 Wireshark USB 捕获工作 显然 Catalina 之前的技巧就是调出界面 以便 Wireshark 可以看到它 https forums developer apple com thread 95380 https
  • ggplot2 具有多个参数的绘图函数

    我得到了这个功能 change lt function score d k p k score 1 1 k d p 我想在一个图中绘制该函数对于一系列参数 d 和 p 的所有结果 在 r 基数中 就是这样 parameters lt c 1
  • Django:如何重定向到表单起源的页面

    在我的 Django 应用程序中 我有多个页面显示一个链接 该链接加载一个显示表单的新页面 提交表单后 重定向到访问该表单的原始页面的最简洁方法是什么 原始页面 gt 表单页面 gt 原始页面 使用下一个变量似乎不太优雅 因为我必须将其设置
  • 证书基本约束的路径长度

    对于 CA 类型的基本约束 路径长度为 0 和 None 是否相同 澄清一下 路径长度为 0 是否意味着 CA 不能颁发证书 而路径长度为 none 是否意味着它可以颁发无限数量的证书 取自RFC 5280 https www rfc ed
  • 为什么人们在 PHP 框架中使用单例

    好吧 伙计们 我很难理解为什么需要单例 让我们举一个真实的例子 我有一个 CMS 框架我需要一个记录一些信息的类 让我们继续使用 PHP Example class Logger private logs array public func
  • 插入特定行数

    我正在尝试插入特定数量的行 现在我正在使用下面的代码插入 4 行 我正在尝试编写一行代码 该代码将根据特定单元格中的数字插入特定数字或行 例如 如果我想插入 4 行 并且单元格 A2 是我可以更改要添加的行数的单元格 那么我将使用什么代码根
  • ld:找不到 -lgcc_s.10.5 Xcode 的库

    ld library not found for lgcc s 10 5 collect2 ld returned 1 exit status Command Developer Platforms iPhoneSimulator plat
  • 为什么消费者在使用 Java 客户端 API 在 DC/OS 上消费来自 Kafka 的消息时会挂起?

    我在 AWS 上的 DC OS Mesos 集群上安装了 Kafka 启用三个代理并创建一个名为 topic1 的主题 dcos kafka topic create topic1 partitions 3 replication 3 然后
  • 从 ES6 map() 函数返回多个值

    假设我有这样的事情 let values 1 2 3 4 let newValues values map v gt return v v console log newValues 1 4 9 16 非常简单 现在 如果我想为每个对象返回
  • 如何使用 useEffect 设置参数并避免无限渲染?

    我在用着react navigation我有一个动态标题 所以我使用setParams并将其放在标题中 const MyComponent navigation gt useEffect gt const setParams state n
  • 为什么属性名称不能是 Python 关键字?

    Python 中对属性访问的语法有限制 至少在 CPython 2 7 2 实现中 gt gt gt class C object pass gt gt gt o C gt gt gt o x 123 Works gt gt gt o if
  • 如何对列表中第一个值相同的元组求和?

    我有一个元组形式的股票和头寸列表 正值表示买入 负值表示卖出 例子 p AAPL 50 AAPL 50 RY 100 RY 43 如何对股票头寸求和以获得当前持有量 result AAPL 0 RY 57 这个怎么样 您可以阅读有关coll
  • 如何在pygame中创建子弹? [复制]

    这个问题在这里已经有答案了 我知道有几个关于此的主题 但我仍然不知道如何让我的船发射子弹 我想添加到我的 MOUSEBUTTONDOWN 中 当音效播放时 从船上发射子弹 谢谢您的帮助 import sys pygame pygame mi
  • Resharper:文件头文本不会自动用于新文件

    我正在使用 VS2010 Resharper 8 0 1 StyleCop 4 7 45 我在 resharper 选项中定义了一个文件头文本 并 错误地 假设它将在重构时使用 使用 将类移动到新文件以匹配文件名 功能 这也不使用可以修改的
  • Java InputStream.read(byte[], int, int) 方法,如何阻塞直到读取了确切的字节数

    我正在编写一个简单的客户端 服务器网络应用程序来发送和接收固定尺寸通过 TCP 套接字发送消息 到目前为止 我一直在使用getInputStream and getOutputStream 的方法Socket类来获取流 然后调用read b
  • 反应本机儿童父母沟通

    使用 pass 道具 父子沟通似乎没有问题 mainpage ios js代码 var OtherPage require otherpage
  • SDWebImage 是否支持“快速滚动时不滚动”(略读)以进行延迟加载?

    进行延迟加载时 UICollectionView的表 为了获得正确的结果 当用户在集合上快速滚动时 您不应该开始下载 因此 想象一下有 200 个面板的垂直卷轴 每个面板都有一个图像 屏幕上一次出现四到五个 首次加载时 应开始加载前 4 个
  • 来自另一个站点的内容的 jQuery 对话框

    我正在使用 jQuery 它可爱又简单dialog命令在某些嵌入的第 3 方内容前面打开一个对话框 该嵌入内容可以是任何网站的页面 我CAN让它在某些网站 雅虎 谷歌 上工作 但我CANNOT让它在其他网站 MSN Johnlewis FT
  • 我们来为python的numpy做一个N维像素分箱/分桶的参考实现

    我经常想要像素仓 像素桶 https en wikipedia org wiki Data binning一个 numpy 数组 意思是 替换组N具有单个像素的连续像素 它是各个像素的总和N替换的像素 例如 从以下值开始 x np arra