python - density - 通过最近邻居平铺上采样numpy数组的快速方法



python histogram bins (2)

这个问题在这里已有答案:

我有一个 MxN 的二维整数数组,我想将数组扩展为 (BM)x(BN) ,其中 B 是方形图块边的长度,因此输入数组的每个元素作为 BxB 块重复在最后的数组中。 下面是嵌套for循环的示例。 有更快/内置的方式吗?

import numpy as np

a = np.arange(9).reshape([3,3])            # input array - 3x3
B=2.                                       # block size - 2  
A = np.zeros([a.shape[0]*B,a.shape[1]*B])  # output array - 6x6

# Loop, filling A with tiled values of a at each index
for i,l in enumerate(a):                   # lines in a
    for j,aij in enumerate(l):             # a[i,j]
        A[B*i:B*(i+1),B*j:B*(j+1)] = aij

结果......

a=      [[0 1 2]
         [3 4 5]
         [6 7 8]]

A =     [[ 0.  0.  1.  1.  2.  2.]
         [ 0.  0.  1.  1.  2.  2.]
         [ 3.  3.  4.  4.  5.  5.]
         [ 3.  3.  4.  4.  5.  5.]
         [ 6.  6.  7.  7.  8.  8.]
         [ 6.  6.  7.  7.  8.  8.]]

Answer #1

一种选择是

>>> a.repeat(2, axis=0).repeat(2, axis=1)
array([[0, 0, 1, 1, 2, 2],
       [0, 0, 1, 1, 2, 2],
       [3, 3, 4, 4, 5, 5],
       [3, 3, 4, 4, 5, 5],
       [6, 6, 7, 7, 8, 8],
       [6, 6, 7, 7, 8, 8]])

由于中间阵列,这有点浪费,但至少简洁。


Answer #2

可能不是最快的,但..

np.kron(a, np.ones((B,B), a.dtype))

它使用 Kronecker产品 ,因此它涉及输出中每个元素的乘法。





numpy