我是numpy的新手,我有一个2D对象数组,我需要将它们分箱到一个更小的矩阵中,然后计算每个分箱中的对象数量,以制作一个热图。我按照on this thread的答案创建了分箱,并计算了一个简单数组的数量,但我不知道如何将其扩展到2D。以下是我目前所拥有的:
data_matrix = numpy.ndarray((500,500),dtype=float)
# fill array with values.
bins = numpy.linspace(0,50,50)
digitized = numpy.digitize(data_matrix, bins)
binned_data = numpy.ndarray((50,50))
for i in range(0,len(bins)):
for j in range(0,len(bins)):
k = len(data_matrix[digitized == i:digitized == j]) # <-not does not work
binned_data[i:j] = k
pidoss.数组上的[digitized == i]
表示法将返回一个二进制值数组。我在任何地方都找不到关于这种表示法的文档。请提供链接。
3条答案
按热度按时间ua4mk5z41#
您可以将数组重新调整为反映所需块结构的四维数组,然后在每个块内沿两个轴求和。例如:
如果
a
的形状为m, n
,则整形的形式应为ecfdbz9o2#
一开始我还打算建议您使用
np.histogram2d
,而不是重新发明轮子,但后来我意识到,这将是矫枉过正,并将需要一些黑客仍然。如果我没理解错的话,你只需要对输入的所有子矩阵求和,这很容易就能实现:检查输出子矩阵并对输入的每个子块求和:
此打印
这实际上是对形状为
(2,3)
的子矩阵求和的结果。请注意,我使用
//
进行整数除法,以确保它与python3兼容,但在python2的情况下,您可以只使用/
进行除法(因为涉及的数字是整数)。6qftjkof3#
另一个解决方案是看一下binArray函数在这里的注解:合并numpy数组
使用您的示例:
结果将
data_matrix
(大小为500 x500)中所有大小为10 x10的正方形相加,以获得binned_data
(大小为50 x50)中每个正方形的单个值。希望这个能帮上忙!