Python / NumPy:找到零的第一个索引,然后在每一行之后将所有元素替换为零

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

我有一个像这样的numpy数组:

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

问题1:如标题所示,在第一个零出现后,我想用零替换所有元素。结果应该是这样的:

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

问题2:如何像本例一样为每一行切片不同的列?由于我正在处理大型数组。如果有人能找到解决此问题的有效方法。非常感谢。

python numpy slice
4个回答
0
投票

问题1:您可以像这样遍历数组:

for i in range(a.shape[0]):
    j = 0
    row = a[i]
    while row[j]>0:
        j += 1
    row[j+1:] = 0

这将就地更改数组。如果您对非常高的性能感兴趣,可以使用the answers to this question更快地找到第一个零。 np.where为此扫描整个阵列,因此不是最佳的任务。实际上,最快的解决方案在一定程度上取决于数组项的分布:如果其中有很多浮点,而很少有零,则上面代码中的while循环平均会中断很晚,只需要写“几个”零。但是,如果在样本数组中只有两个可能的条目,并且它们以相似的概率(即〜50%)发生,那么将有很多零要写入a,并且以下操作会更快:

b = np.zeros(a.shape)
for i in range(a.shape[0]):
    j = 0
    a_row = a[i]
    b_row = b[i]
    while a_row[j]>0:
        b_row[j] = a_row[j]
        j += 1

问题2:如果您打算按照处理某类首次出现的类似准则分别对每一行进行切片,则可以简单地调整此迭代模式。如果条件更具全局性(例如,查找行的最大值),则存在诸如np.where之类的内置方法,它们会更高效,但可能会取决于条件本身,哪种选择最佳。 >


0
投票

问题1


0
投票

完成问题1的一种方法是使用numpy.cumprod


0
投票

我更喜欢第一个问题的艾拉(Ayrat)的答案,但是如果您需要为不同的行将不同的列切成大块,这可以为您提供帮助:

© www.soinside.com 2019 - 2024. All rights reserved.