gpt4 book ai didi

python - 在 numpy 数组上使用二进制结构迭代以获得单元格总和

转载 作者:太空宇宙 更新时间:2023-11-03 13:03:05 26 4
gpt4 key购买 nike

在包 scipy 中有定义二进制结构的函数(例如出租车 (2,1) 或棋盘 (2,2))。

import numpy
from scipy import ndimage
a = numpy.zeros((6,6), dtype=numpy.int)
a[1:5, 1:5] = 1;a[3,3] = 0 ; a[2,2] = 2
s = ndimage.generate_binary_structure(2,2) # Binary structure
#.... Calculate Sum of
result_array = numpy.zeros_like(a)

我想要的是用给定的结构 s 遍历这个数组的所有单元格。然后我想将一个函数附加到空数组中索引的当前单元格值(示例函数 sum),它使用二进制结构中所有单元格的值。

例如:

array([[0, 0, 0, 0, 0, 0],
[0, 1, 1, 1, 1, 0],
[0, 1, 2, 1, 1, 0],
[0, 1, 1, 0, 1, 0],
[0, 1, 1, 1, 1, 0],
[0, 0, 0, 0, 0, 0]])

#数组a。单元格 1,2 中的值当前为 1。给定结构 s 和示例函数(例如 sum),结果数组 (result_array) 中的值变为 7(如果不包括当前单元格值,则为 6)。

有人有想法吗?

最佳答案

对于求和的特殊情况,您可以使用 ndimage.convolve :

In [42]: import numpy as np

In [43]: a = np.zeros((6,6), dtype=np.int)
a[1:5, 1:5] = 1;
a[3,3] = 0;
a[2,2] = 2

In [48]: s = ndimage.generate_binary_structure(2,2) # Binary structure

In [49]: ndimage.convolve(a,s)
Out[49]:
array([[1, 2, 3, 3, 2, 1],
[2, 5, 7, 7, 4, 2],
[3, 7, 9, 9, 5, 3],
[3, 7, 9, 9, 5, 3],
[2, 4, 5, 5, 3, 2],
[1, 2, 3, 3, 2, 1]])

对于产品的特殊情况,您可以使用 log(a*b) = log(a)+log(b) 这一事实将问题转换回涉及求和的问题。例如,如果我们想要“乘积卷积”b:

b = a[1:-1, 1:-1]
print(b)
# [[1 1 1 1]
# [1 2 1 1]
# [1 1 0 1]
# [1 1 1 1]]

我们可以计算:

print(np.exp(ndimage.convolve(np.log(b), s, mode = 'constant')))
# [[ 2. 2. 2. 1.]
# [ 2. 0. 0. 0.]
# [ 2. 0. 0. 0.]
# [ 1. 0. 0. 0.]]

如果 b 包含负值,情况会变得更加复杂:

b[0,1] = -1
print(b)
# [[ 1 -1 1 1]
# [ 1 2 1 1]
# [ 1 1 0 1]
# [ 1 1 1 1]]

但并非不可能:

logb = np.log(b.astype('complex'))
real, imag = logb.real, logb.imag
print(np.real_if_close(
np.exp(
sum(j * ndimage.convolve(x, s, mode = 'constant')
for x,j in zip((real, imag),(1,1j))))))
# [[-2. -2. -2. 1.]
# [-2. -0. -0. 0.]
# [ 2. 0. 0. 0.]
# [ 1. 0. 0. 0.]]

关于python - 在 numpy 数组上使用二进制结构迭代以获得单元格总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13463483/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com