首页 > 解决方案 > 如何将 2d np.array 中的每十分之一(非零)值替换为零

问题描述

我一直在尝试,但没有奏效。

for x in range(0,len(A),10):
    for y in range (0,len(A),10):
        if x > 0:
            if y > 0:
                A[index] = 0

标签: pythonarrays

解决方案


一种方法是使用np.nonzero查找非零元素的索引,然后简单地将它们的一部分设置为零:

i = np.nonzero(A)
A[i[0][::10], i[1][::10]] = 0

例如:

In [128]: A = np.random.randint(0, 2, (8,8))

In [129]: A
Out[129]: 
array([[0, 0, 1, 1, 1, 1, 1, 0],
       [0, 1, 1, 0, 1, 1, 0, 1],
       [0, 0, 0, 1, 0, 1, 1, 0],
       [0, 0, 1, 0, 1, 0, 1, 0],
       [0, 0, 0, 1, 0, 1, 1, 0],
       [1, 1, 0, 0, 0, 1, 0, 1],
       [0, 1, 1, 1, 0, 0, 1, 0],
       [1, 1, 1, 1, 1, 0, 1, 0]])

In [130]: i = np.nonzero(A)

In [131]: A[i[0][::10], i[1][::10]] = 0

In [132]: A
Out[132]: 
array([[0, 0, 0, 1, 1, 1, 1, 0],
       [0, 1, 1, 0, 1, 1, 0, 1],
       [0, 0, 0, 0, 0, 1, 1, 0],
       [0, 0, 1, 0, 1, 0, 1, 0],
       [0, 0, 0, 1, 0, 1, 1, 0],
       [1, 0, 0, 0, 0, 1, 0, 1],
       [0, 1, 1, 1, 0, 0, 1, 0],
       [1, 1, 1, 0, 1, 0, 1, 0]])

这会将第 0、第 10、第 20 等非零索引设置为 0。如果您更喜欢第 9、第 19 等,您可以更改偏移量:

A[i[0][10-1::10], i[1][10-1::10]] = 0

推荐阅读