我开始使用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
包含2张np.array().flatten()
图片(最终更多)
joint_hist[]
稍后与plt.imshow()
一起显示,是这2张图像的联合直方图
bin_size
是直方图中的槽数
我无法确定的事实是,最终直方图中的坐标是I,J。因此,不仅仅是join_hist []中某个位置的值是某些切片/逐元素计算的结果。我需要获取该计算的结果,并使用THAT作为joint_hist ...中的索引...
编辑:
实际上,我实际上并没有在循环中使用i-这是以前迭代中的遗留物,我只是没有注意到我不再需要它了
我确实希望控制垃圾箱的大小以及如何执行此操作的详细信息,所以不要特别希望使用histogramm2D。稍后我将使用它来进行进一步的图像处理,因此我宁愿灵活地调整自己的方法,也不必弄清楚是否/如何使用内置函数来做特定的事情。
答案 0 :(得分:2)
您确实可以使用一些numpy表示法来搅乱for
循环。假设您实际上并不需要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
循环遍历2D数组时,一次返回一行。因此,for I,J in arr
语法将一次给您一对像素,就像您的zip
语句最初所做的那样。
您也可以只使用histogramdd
来计算joint_hist
,以代替for
循环。对于您的应用程序,它看起来像:
import numpy as np
joint_hist,edges = np.histogramdd(data_list.T)
这将具有与上面指定的垃圾箱不同的垃圾箱(numpy会自动确定它们)。
答案 1 :(得分:0)
据我了解,您的目标是在图像中制作直方图或相关值?好吧,要获得正确的bin索引,您使用的计算无效。代替np.floor(I / self.bin_size),请使用np.floor(I /(I_max / bin_size))。astype(int)。您想将I和J除以它们各自的分辨率。如果data_list [0]和data_list [1]是同一张展平的图像,则结果将是joint_hist的对角矩阵。
所以所有这些放在一起:
I_max = data_list[0].max()+1
J_max = data_list[1].max()+1
joint_hist = np.zeros((I_max, J_max))
bin_size = 256
for i, (I, J) in enumerate(zip(data_list[0], data_list[1])):
joint_hist[np.floor(I / (I_max / bin_size)).astype(int), np.floor(J / (J_max / bin_size)).astype(int)] += 1