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

用 Numpy 表示法替换 enumerate(zip(...))

用 Numpy 表示法替换 enumerate(zip(...))

神不在的星期二 2021-08-14 15:56:22
我开始使用 numpy。我得到了切片符号和元素计算,但我无法理解:for i, (I,J) in enumerate(zip(data_list[0], data_list[1])):    joint_hist[int(np.floor(I/self.bin_size))][int(np.floor(J/self.bin_size))] += 1变量:data_list包含两个np.array().flatten()图像(最终更多)joint_hist[] 是这两个图像的联合直方图,稍后显示 plt.imshow()bin_size 是直方图中的槽数我不明白为什么最终直方图中的坐标是I,J. 因此,不仅仅是某个位置的值joint_hist[]是某些切片/元素计算的结果。我需要获取该计算的结果并使用 THAT 作为joint_hist 中的索引...编辑:我确实实际上并没有i在循环中使用- 它是以前迭代的剩余物,我只是没有注意到我不再需要它了我确实希望保持对 bin 大小的控制以及如何完成此操作的详细信息,因此并不特别希望使用 histogramm2D。我稍后将使用它进行进一步的图像处理,因此我宁愿灵活地调整我的方法,而不是必须弄清楚是否/如何使用内置函数来做特定的事情。
查看完整描述

2 回答

?
跃然一笑

TA贡献1826条经验 获得超6个赞

您确实可以for使用一些 numpy 符号来修饰该循环。假设您实际上不需要i(因为它不在任何地方使用):


for I,J in (data_list.T // self.bin_size).astype(int):

    joint_hist[I, J] += 1

解释

data_list.T侧翻data_list。的每一行都data_list.T将包含特定坐标处像素的数据。


data_list.T // self.bin_size将产生与 相同的结果np.floor(I/self.bin_size),只是它一次对所有像素进行操作,而不是一次操作一个。


.astype(int)与 做同样的事情int(...),但再次对整个数组而不是单个元素进行操作。


当您使用循环遍历二维数组时,一次for返回一行。因此,for I,J in arr语法将一次返回一对像素,就像您的zip语句最初所做的那样。


选择

你也可以只histogramdd用来计算joint_hist,代替你的for循环。对于您的应用程序,它看起来像:


import numpy as np


joint_hist,edges = np.histogramdd(data_list.T)

不过,这将与您在上面指定的垃圾箱不同(numpy 会自动确定它们)。


查看完整回答
反对 回复 2021-08-14
  • 2 回答
  • 0 关注
  • 209 浏览
慕课专栏
更多

添加回答

举报

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