如何修改ndarray矩阵中的特定字段

时间:2015-07-31 21:18:20

标签: python

我有一个像这样的矩阵

x = [[a, b],
     [c, d]]

但是对于每个值而不是a,b,c,d,都有一个数字列表,例如[x,xx,xxx]。

我想创建另一个矩阵,只有在x == 0&& xx == 0&& XXX == 0。如果没有循环我怎么能这样做?例如,我可以做B = [x == 0],但是如果有列表而不是单个矩阵元素,我怎么能这样做呢?

1 个答案:

答案 0 :(得分:1)

如果列表具有固定长度,您可以创建一个3d数组,然后在其最后一个轴上使用np.all()

In [1]: import numpy as np

In [2]: a = np.zeros((2, 2, 3)) # 2x2 matrix, 3 variants for each element

In [3]: a[0, 0] = [0, 1, 2] # filling one element of the "matrix"

In [4]: a[0, 1] = 1

In [5]: a[1, 1] = 0 # this

In [6]: a[1, 0] = 0 # and this are "all zeros"

In [7]: a
Out[7]: 
array([[[ 0.,  1.,  2.],
        [ 1.,  1.,  1.]],

       [[ 0.,  0.,  0.],
        [ 0.,  0.,  0.]]])

现在让我们构建矩阵b

In [8]: np.all(a == 0, axis=-1).astype(int)
Out[8]: 
array([[0, 0],
       [1, 1]])

如果您想要其他条件,可以按以下方式修改表达式:

In [9]: np.all(a - [0, 1, 2] == 0, axis=-1).astype(int)
Out[9]: 
array([[1, 0],
       [0, 0]])