scipy 如何在numpy中绑定二维数组?

k4ymrczo  于 2022-11-10  发布在  其他
关注(0)|答案(3)|浏览(167)

我是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]表示法将返回一个二进制值数组。我在任何地方都找不到关于这种表示法的文档。请提供链接。

ua4mk5z4

ua4mk5z41#

您可以将数组重新调整为反映所需块结构的四维数组,然后在每个块内沿两个轴求和。例如:

>>> a = np.arange(24).reshape(4, 6)
>>> a
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11],
       [12, 13, 14, 15, 16, 17],
       [18, 19, 20, 21, 22, 23]])
>>> a.reshape(2, 2, 2, 3).sum(3).sum(1)
array([[ 24,  42],
       [ 96, 114]])

如果a的形状为m, n,则整形的形式应为

a.reshape(m_bins, m // m_bins, n_bins, n // n_bins)
ecfdbz9o

ecfdbz9o2#

一开始我还打算建议您使用np.histogram2d,而不是重新发明轮子,但后来我意识到,这将是矫枉过正,并将需要一些黑客仍然。
如果我没理解错的话,你只需要对输入的所有子矩阵求和,这很容易就能实现:检查输出子矩阵并对输入的每个子块求和:

import numpy as np

def submatsum(data,n,m):
    # return a matrix of shape (n,m)
    bs = data.shape[0]//n,data.shape[1]//m  # blocksize averaged over
    return np.reshape(np.array([np.sum(data[k1*bs[0]:(k1+1)*bs[0],k2*bs[1]:(k2+1)*bs[1]]) for k1 in range(n) for k2 in range(m)]),(n,m))

# set up dummy data

N,M = 4,6
data_matrix = np.reshape(np.arange(N*M),(N,M))

# set up size of 2x3-reduced matrix, assume congruity

n,m = N//2,M//3
reduced_matrix = submatsum(data_matrix,n,m)

# check output

print(data_matrix)
print(reduced_matrix)

此打印

print(data_matrix)
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]]

print(reduced_matrix)
[[ 24  42]
 [ 96 114]]

这实际上是对形状为(2,3)的子矩阵求和的结果。
请注意,我使用//进行整数除法,以确保它与python3兼容,但在python2的情况下,您可以只使用/进行除法(因为涉及的数字是整数)。

6qftjkof

6qftjkof3#

另一个解决方案是看一下binArray函数在这里的注解:合并numpy数组
使用您的示例:

data_matrix = numpy.ndarray((500,500),dtype=float)
binned_data = binArray(data_matrix, 0, 10, 10, np.sum)
binned_data = binArray(binned_data, 1, 10, 10, np.sum)

结果将data_matrix(大小为500 x500)中所有大小为10 x10的正方形相加,以获得binned_data(大小为50 x50)中每个正方形的单个值。
希望这个能帮上忙!

相关问题