我开始使用 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 会自动确定它们)。
添加回答
举报
0/150
提交
取消