沿数组中的轴传播真实条目

问题描述 投票:0回答:1

我必须多次执行以下操作。使用 numpy 函数而不是循环,我通常会获得非常好的性能,但我无法将其复制到更高维的数组。任何建议或替代方案将非常受欢迎:

我有一个布尔数组,我想将 true indeces 传播到接下来的 2 个位置,例如:

如果这个一维数组(A)是:

import numpy as np

# Number of positions to propagate the array
propagation = 2

# Original array
A = np.array([False, True, False, False, False, True, False, False, False, False, False, True, False])

我可以创建一个“空”数组,然后找到索引,传播它们,然后展平 argwhere,然后展平它:

B = np.zeros(A.shape, dtype=bool)

# Compute the indeces of the True values and make the two next to it True as well
idcs_true = np.argwhere(A) + np.arange(propagation + 1)
idcs_true = idcs_true.flatten()
idcs_true = idcs_true[idcs_true < A.size] # in case the error propagation gives a great
B[idcs_true] = True

# Array
print(f'Original array     A = {A}')
print(f'New array (2 true) B = {B}')

给出:

Original array     A = [False  True False False False  True False False False False False  True
 False]
New array (2 true) B = [False  True  True  True False  True  True  True False False False  True
  True]

但是,这会变得更加复杂并且会失败,例如:

AA = np.array([[False, True, False, False, False, True, False, False, False, False, False, True, False],
               [False, True, False, False, False, True, False, False, False, False, False, True, False]])

感谢您的任何建议。

python numpy convolution array-broadcasting
1个回答
0
投票

您可以将当前代码包装在一个函数中,然后将其与二维 AA 数组一起提供给

np.apply_along_axis
函数。

import numpy as np

# Number of positions to propagate the array
propagation = 2

# Original array
AA = np.array([[False, True, False, False, False, True, False, False, False, False, False, True, False],
             [False, True, False, False, False, True, False, False, False, False, False, True, False]])

def prop_func(A):
    B = np.zeros(A.shape, dtype=bool)

    # Compute the indices of the True values and make the two next to it True as well
    idcs_true = np.argwhere(A) + np.arange(propagation + 1)
    idcs_true = idcs_true.flatten()
    idcs_true = idcs_true[idcs_true < A.size] # in case the error propagation gives a great
    B[idcs_true] = True
    return B

# Apply prop_func along the rows (axis=1)
BB = np.apply_along_axis(prop_func, 1, AA)

# Array
print(f'Original array     AA = {AA}')
print(f'New array (2 true) BB = {BB}')
Original array     AA = 
[[False  True False False False  True False False False False False  True
  False]
 [False  True False False False  True False False False False False  True
  False]]
New array (2 true) BB = 
[[False  True  True  True False  True  True  True False False False  True
   True]
 [False  True  True  True False  True  True  True False False False  True
   True]]
© www.soinside.com 2019 - 2024. All rights reserved.