python : How to fill an array line by line?

标签 python numpy fill

我有一个我无法解决的 numpy 问题。 我有填充 0 和 1 的 3D 数组 (x,y,z)。 例如,z 轴上的一个切片:

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

我想要这个结果:

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

也就是说,我想为每个切片 z 做的是从右到左和从左到右(x 轴)逐行扫描,第一次有 1 我想填充其余部分与那些一致。

有没有一种有效的方法来计算它?

非常感谢。

妮可!

最佳答案

逐个访问 NumPy 数组元素效率不高。您可能只使用普通的 Python 列表会做得更好。它们还有一个 index 方法,可以在列表中搜索值的第一个条目。

from numpy import *

a = array([[1, 0, 1, 0, 1, 1, 0, 0],
       [0, 0, 1, 1, 0, 1, 1, 0],
       [1, 0, 1, 1, 0, 0, 0, 1],
       [0, 1, 0, 0, 1, 0, 1, 0],
       [1, 1, 1, 0, 1, 0, 0, 1],
       [1, 0, 0, 0, 0, 1, 0, 1],
       [0, 0, 0, 0, 1, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 1, 0, 1, 1, 0, 1]])

def idx_front(ln):
    try:
        return list(ln).index(1)
    except ValueError:
        return len(ln) # an index beyond line end

def idx_back(ln):
    try:
        return len(ln) - list(reversed(ln)).index(1) - 1
    except ValueError:
        return len(ln) # an index beyond line end

ranges = [ (idx_front(ln), idx_back(ln)) for ln in a ]
for ln, (lo,hi) in zip(a, ranges):
    ln[lo:hi] = 1  # attention: destructive update in-place

print "ranges =", ranges
print a

输出:

ranges = [(0, 5), (2, 6), (0, 7), (1, 6), (0, 7), (0, 7), (4, 4), (8, 8), (2, 7)]
[[1 1 1 1 1 1 0 0]
 [0 0 1 1 1 1 1 0]
 [1 1 1 1 1 1 1 1]
 [0 1 1 1 1 1 1 0]
 [1 1 1 1 1 1 1 1]
 [1 1 1 1 1 1 1 1]
 [0 0 0 0 1 0 0 0]
 [0 0 0 0 0 0 0 0]
 [0 0 1 1 1 1 1 1]]

关于 python : How to fill an array line by line?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6626194/

相关文章:

python - numpy 二进制符号快速生成

matlab - 两个时间序列图和它们之间的阴影......MATLAB

c# - unity填充量lerp返回错误值

python - Pylons/路线 url_for() 在模板内改变了吗?

python - 在 Python 中重新打开包

python - 使用 Google Cloud Storage API 处理大文件

r - ggplot2:根据填充值为某些点设置alpha = 0

python - 如何从 SQLAlchemy 中的 id 池中获取每组的前 n 个结果?

python - 如何删除二维数组中具有特定值的行并修改列值?

python - 如何在这里进行广义特征分解?