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

我开始使用 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。我稍后将使用它进行进一步的图像处理,因此我宁愿灵活地调整我的方法,而不是必须弄清楚是否/如何使用内置函数来做特定的事情。


神不在的星期二
浏览 210回答 2
2回答

跃然一笑

您确实可以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 npjoint_hist,edges = np.histogramdd(data_list.T)不过,这将与您在上面指定的垃圾箱不同(numpy 会自动确定它们)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python