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

Python 如何将2d np.数组中的每十分之一(非零)值替换为零,python,arrays,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 我就是这样解决这个问题的: index=0 for x in range(0, 219): for y in range(0, 219): if (index+1) % 1

我一直在尝试,但没有成功

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

我就是这样解决这个问题的:

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个非零值替换为零。

如果我理解您想要正确执行的操作,那么在循环外使用一个计数器变量来跟踪到目前为止看到的非零元素的数量并在数组中迭代,这应该是相当容易的:

# 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。

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

在你的例子中,
A
是什么?你能给出一些输入和输出的例子吗?“每十分之一(非零)值”是不明确的,而且与您的代码所做的完全不同。您可能会发现这很有帮助:A是一个219乘219的起点-终点行程矩阵,其中大多数值为0,但也有一些值,2%为非零。在这些非零中,我希望有90%的零和10%的非零。