用数字符号替换枚举(zip(....))

时间:2018-11-10 18:12:23

标签: python numpy

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

2 个答案:

答案 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_listdata_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