如何在将值四分之一的同时将矩阵的维度加倍?
How to double the dimension of a matrix while quartering the values?
我想实现这个:
a = np.array ([[1, 2],
[2, 1]])
b = np.array ([[0.25, 0.25, 0.5, 0.5],
[0.25, 0.25, 0.5, 0.5],
[0.5, 0.5, 0.25, 0.25],
[0.5, 0.5, 0.25, 0.25])
从数学上讲,它们不是相同的矩阵。但我想你知道我想做什么。我想将矩阵的维度加倍。但是因此我想通过为四个相应的单元格取四分之一来保留初始矩阵 a 中的信息。
有人知道如何在 numpy 中高效地执行此操作吗?
您可以在两个轴上使用两个重复函数,然后进行简单的除法:
In [8]: np.repeat(np.repeat(a, 2, 1), 2, 0)/4
Out[8]:
array([[0.25, 0.25, 0.5 , 0.5 ],
[0.25, 0.25, 0.5 , 0.5 ],
[0.5 , 0.5 , 0.25, 0.25],
[0.5 , 0.5 , 0.25, 0.25]])
这是 np.broadcast_to
的一个,它利用 broadcasting
来避免两个复制阶段或平铺以获得性能优势 -
# "Expand" array a by Height, H and Width, W
def expand_blockavg(a, H, W):
m,n = a.shape
return np.broadcast_to((a/float(H*W))[:,None,:,None],(m,H,n,W)).reshape(m*H,-1)
样品运行 -
In [93]: a
Out[93]:
array([[1, 2],
[2, 1]])
In [94]: expand_blockavg(a, H=2, W=2)
Out[94]:
array([[0.25, 0.25, 0.5 , 0.5 ],
[0.25, 0.25, 0.5 , 0.5 ],
[0.5 , 0.5 , 0.25, 0.25],
[0.5 , 0.5 , 0.25, 0.25]])
In [95]: expand_blockavg(a, H=2, W=3)
Out[95]:
array([[0.17, 0.17, 0.17, 0.33, 0.33, 0.33],
[0.17, 0.17, 0.17, 0.33, 0.33, 0.33],
[0.33, 0.33, 0.33, 0.17, 0.17, 0.17],
[0.33, 0.33, 0.33, 0.17, 0.17, 0.17]])
大型数组的运行时测试 -
In [2]: a = np.random.rand(200,200)
# Expand by (2 x 2)
# @Kasrâmvd's soln
In [85]: %timeit np.repeat(np.repeat(a, 2, 1), 2, 0)/4
1000 loops, best of 3: 492 µs per loop
In [86]: %timeit expand_blockavg(a, H=2, W=2)
1000 loops, best of 3: 382 µs per loop
# Expand by (20 x 20)
# @Kasrâmvd's soln
In [5]: %timeit np.repeat(np.repeat(a, 20, 1), 20, 0)/400
10 loops, best of 3: 32 ms per loop
In [6]: %timeit expand_blockavg(a, H=20, W=20)
10 loops, best of 3: 20.1 ms per loop
具有 (2 x 2) 扩展的更大数组 -
In [87]: a = np.random.rand(2000,2000)
# @Kasrâmvd's soln
In [88]: %timeit np.repeat(np.repeat(a, 2, 1), 2, 0)/4
10 loops, best of 3: 70.2 ms per loop
In [89]: %timeit expand_blockavg(a, H=2, W=2)
10 loops, best of 3: 51.6 ms per loop
我想实现这个:
a = np.array ([[1, 2],
[2, 1]])
b = np.array ([[0.25, 0.25, 0.5, 0.5],
[0.25, 0.25, 0.5, 0.5],
[0.5, 0.5, 0.25, 0.25],
[0.5, 0.5, 0.25, 0.25])
从数学上讲,它们不是相同的矩阵。但我想你知道我想做什么。我想将矩阵的维度加倍。但是因此我想通过为四个相应的单元格取四分之一来保留初始矩阵 a 中的信息。
有人知道如何在 numpy 中高效地执行此操作吗?
您可以在两个轴上使用两个重复函数,然后进行简单的除法:
In [8]: np.repeat(np.repeat(a, 2, 1), 2, 0)/4
Out[8]:
array([[0.25, 0.25, 0.5 , 0.5 ],
[0.25, 0.25, 0.5 , 0.5 ],
[0.5 , 0.5 , 0.25, 0.25],
[0.5 , 0.5 , 0.25, 0.25]])
这是 np.broadcast_to
的一个,它利用 broadcasting
来避免两个复制阶段或平铺以获得性能优势 -
# "Expand" array a by Height, H and Width, W
def expand_blockavg(a, H, W):
m,n = a.shape
return np.broadcast_to((a/float(H*W))[:,None,:,None],(m,H,n,W)).reshape(m*H,-1)
样品运行 -
In [93]: a
Out[93]:
array([[1, 2],
[2, 1]])
In [94]: expand_blockavg(a, H=2, W=2)
Out[94]:
array([[0.25, 0.25, 0.5 , 0.5 ],
[0.25, 0.25, 0.5 , 0.5 ],
[0.5 , 0.5 , 0.25, 0.25],
[0.5 , 0.5 , 0.25, 0.25]])
In [95]: expand_blockavg(a, H=2, W=3)
Out[95]:
array([[0.17, 0.17, 0.17, 0.33, 0.33, 0.33],
[0.17, 0.17, 0.17, 0.33, 0.33, 0.33],
[0.33, 0.33, 0.33, 0.17, 0.17, 0.17],
[0.33, 0.33, 0.33, 0.17, 0.17, 0.17]])
大型数组的运行时测试 -
In [2]: a = np.random.rand(200,200)
# Expand by (2 x 2)
# @Kasrâmvd's soln
In [85]: %timeit np.repeat(np.repeat(a, 2, 1), 2, 0)/4
1000 loops, best of 3: 492 µs per loop
In [86]: %timeit expand_blockavg(a, H=2, W=2)
1000 loops, best of 3: 382 µs per loop
# Expand by (20 x 20)
# @Kasrâmvd's soln
In [5]: %timeit np.repeat(np.repeat(a, 20, 1), 20, 0)/400
10 loops, best of 3: 32 ms per loop
In [6]: %timeit expand_blockavg(a, H=20, W=20)
10 loops, best of 3: 20.1 ms per loop
具有 (2 x 2) 扩展的更大数组 -
In [87]: a = np.random.rand(2000,2000)
# @Kasrâmvd's soln
In [88]: %timeit np.repeat(np.repeat(a, 2, 1), 2, 0)/4
10 loops, best of 3: 70.2 ms per loop
In [89]: %timeit expand_blockavg(a, H=2, W=2)
10 loops, best of 3: 51.6 ms per loop