如何将2d np.array中的每十分之一(非零)值替换为零

时间:2018-08-05 22:47:39

标签: python arrays

我一直在尝试,但是没有用。

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

3 个答案:

答案 0 :(得分:1)

一种方法是使用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

答案 1 :(得分:0)

这是我解决问题的方法:

index=0
for x in range(0, 219):
    for y in range(0, 219):
        if (index+1) % 10 == 0:
            A[x][y] = 0
        index+=1
print(A)

对于任何正在看的人: 我有一个219x219 np.array,我想将每10个非零值都替换为零。

答案 2 :(得分:0)

如果我了解您要正确执行的操作,那么应该很容易做到这一点,只需在循环外添加一个计数器变量来跟踪到目前为止您已经看到了多少个非零元素,并且{{3 }}遍历数组:

# a = np.array(...)
count = 0
for x in np.nditer(a, op_flags=['readwrite']):
    if x != 0:
        count += 1
        if count % 10 == 0:
            x[...] = 0

测试数组:

[[  0.   1.   2.   3.   4.   0.   5.   6.   0.   7.   0.   0.]
 [  8.   0.   9.   0.  10.   0.  11.  12.   0.   0.   0.   0.]
 [  0.   0.   0.   0.   0.  13.  14.   0.   0.   0.  15.  16.]
 [  0.   0.   0.   0.   0.  17.  18.   0.   0.   0.   0.  19.]
 [ 20.   0.  21.  22.   0.   0.   0.  23.   0.  24.   0.   0.]
 [ 25.   0.   0.  26.  27.   0.  28.   0.  29.   0.   0.   0.]
 [  0.   0.  30.  31.   0.   0.  32.   0.  33.  34.  35.  36.]
 [ 37.   0.   0.   0.  38.   0.  39.   0.  40.  41.   0.   0.]
 [  0.  42.  43.   0.  44.   0.  45.  46.  47.   0.  48.  49.]
 [  0.  50.  51.  52.   0.  53.   0.  54.  55.   0.  56.   0.]]

之后:

[[  0.   1.   2.   3.   4.   0.   5.   6.   0.   7.   0.   0.]
 [  8.   0.   9.   0.   0.   0.  11.  12.   0.   0.   0.   0.]
 [  0.   0.   0.   0.   0.  13.  14.   0.   0.   0.  15.  16.]
 [  0.   0.   0.   0.   0.  17.  18.   0.   0.   0.   0.  19.]
 [  0.   0.  21.  22.   0.   0.   0.  23.   0.  24.   0.   0.]
 [ 25.   0.   0.  26.  27.   0.  28.   0.  29.   0.   0.   0.]
 [  0.   0.   0.  31.   0.   0.  32.   0.  33.  34.  35.  36.]
 [ 37.   0.   0.   0.  38.   0.  39.   0.   0.  41.   0.   0.]
 [  0.  42.  43.   0.  44.   0.  45.  46.  47.   0.  48.  49.]
 [  0.   0.  51.  52.   0.  53.   0.  54.  55.   0.  56.   0.]]

注意:10、20、30、40和50已更改为0。