使用 numpy 过滤值

我有一个 numpy 零矩阵和 size = (4, 8)


x = [[0, 0, 0 , 0, 0, 0, 0, 0],

     [0, 0, 0 , 0, 0, 0, 0, 0],

     [0, 0, 0 , 0, 0, 0, 0, 0],

     [0, 0, 0 , 0, 0, 0, 0, 0],]

另外,我有三个不同的矩阵。


a = [[1, 1, 1 , 1, 1, 1, 1, 1],

     [1, 1, 1 , 1, 1, 1, 1, 1],

     [1, 1, 1 , 1, 1, 1, 1, 1],

     [1, 1, 1 , 1, 1, 1, 1, 1],]


b = [[2, 2, 2 , 2, 2, 2, 2, 2],

     [2, 2, 2 , 2, 2, 2, 2, 2],

     [2, 2, 2 , 2, 2, 2, 2, 2],

     [2, 2, 2 , 2, 2, 2, 2, 2],] 


c = [[3, 3, 3 , 3, 3, 3, 3, 3],

     [3, 3, 3 , 3, 3, 3, 3, 3],

     [3, 3, 3 , 3, 3, 3, 3, 3],

     [3, 3, 3 , 3, 3, 3, 3, 3],]

我想得到以下结果


output = [[1, 2, 1, 2, 1, 2, 1, 2],

          [2, 3, 2, 3, 2, 3, 2, 3],

          [1, 2, 1, 2, 1, 2, 1, 2],

          [2, 3, 2, 3, 2, 3, 2, 3],]

矩阵 a的值出现在 (row 0, row 2) 和 (column 0, column 2, column 4, column 6)


矩阵 b的值出现在第 0 行、第 1 行、第 2 行、第 3 行,但在第 0 行和第 2 行中,值 2 出现在第 1 列、第 3 列、第 5 列、第 7 列、第 1 行的下一个第 3 行的值 2 出现在第 0 列、第 2 列、第 4 列、第 6 列


矩阵 c的值出现在 (row 1, row 3) 和 (column 1, column 3, column 5, column 7)


import numpy as np

h, w = x.shape

output = np.zeros((h, w))


for i in range(h):

    for j in range(w):

        if (i % 2) == 0 and (j % 2) == 0:

            output[i, j] = a[i, j]

        elif (i % 2) == 1 and (j % 2) == 1:

            output[i, j] = c[i, j]

        else:

            output[i, j] = b[i, j]

print(output)

'''  

output = [[1. 2. 1. 2. 1. 2. 1. 2.]

          [2. 3. 2. 3. 2. 3. 2. 3.]

          [1. 2. 1. 2. 1. 2. 1. 2.]

          [2. 3. 2. 3. 2. 3. 2. 3.]]

'''

我想尽量不使用for循环,可以用numpy解决吗?


浮云间
浏览 135回答 2
2回答

繁花不似锦

您可以使用np.choose:y,x = np.ogrid[:4,:8]np.choose((y&1)+(x&1),[a,b,c])# array([[1, 2, 1, 2, 1, 2, 1, 2],#        [2, 3, 2, 3, 2, 3, 2, 3],#        [1, 2, 1, 2, 1, 2, 1, 2],#        [2, 3, 2, 3, 2, 3, 2, 3]])

泛舟湖上清波郎朗

您需要选择行和列分别为奇数/偶数的索引。这里已经解释过了import numpy as npb = np.ones((4,8))*2# update places where both row & column are evenb[::2,::2] -= 1# update places where both row & column are oddb[1::2,1::2] += 1
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python