处理Python中的矩阵

时间:2017-06-12 06:50:43

标签: python numpy matrix

我是python的新手,在处理Matrices方面遇到了问题。

我有一个矩阵,让我们说

A = [1 0 0 2; 3 3 3 2; 3 3 0 2; 3 4 4 4]

现在,我想让矩阵中的所有元素都等于零,除了在矩阵中重复最多次数的元素。 (在这种情况下,它是3)。

所以预期的结果是,

B = [0 0 0 0; 3 3 3 0; 3 3 0 0;3 0 0 0]

如果有人可以帮我解决python代码,那将非常有用。

4 个答案:

答案 0 :(得分:2)

使用axisNone设置为np.where,在整个数组中获取最多出现的数字。将该数字与输入数组进行比较,为我们提供一个掩码,可以通过元素乘法与输入数组/最多数字或使用from scipy.stats import mode most_occ_num = mode(A, axis=None)[0][0] out = most_occ_num*(A==most_occ_num) 进行选择,将其余设置为零。

因此,一种方法是 -

out = np.where(A==most_occ_num,A,0)

使用Scipy's mode进行数组输出 -

In [129]: A = np.matrix([[1, 0 ,0 ,2],[ 3, 3, 3, 2],[ 3 ,3 ,0 ,2],[ 3 ,4 ,4 ,4]])
In [140]: A
Out[140]: 
matrix([[1, 0, 0, 2],
        [3, 3, 3, 2],
        [3, 3, 0, 2],
        [3, 4, 4, 4]])

In [141]: most_occ_num = mode(A, axis=None)[0][0]

In [142]: most_occ_num*(A==most_occ_num)
Out[142]: 
matrix([[0, 0, 0, 0],
        [3, 3, 3, 0],
        [3, 3, 0, 0],
        [3, 0, 0, 0]])

In [143]: np.where(A==most_occ_num,A,0)
Out[143]: 
array([[0, 0, 0, 0],
       [3, 3, 3, 0],
       [3, 3, 0, 0],
       [3, 0, 0, 0]])

示例运行 -

{{1}}

答案 1 :(得分:1)

 ----------------------------------------------------

答案 2 :(得分:1)

这是MATLAB语法,而不是numpy:

A = [1 0 0 2; 3 3 3 2; 3 3 0 2; 3 4 4 4]

虽然np.matrix用以下方式模拟它:

In [172]: A = np.matrix('1 0 0 2; 3 3 3 2; 3 3 0 2; 3 4 4 4')
In [173]: A
Out[173]: 
matrix([[1, 0, 0, 2],
        [3, 3, 3, 2],
        [3, 3, 0, 2],
        [3, 4, 4, 4]])

你的任务是2倍,找到最常见的元素,然后替换所有其他元素。这两种行为都不取决于矩阵为2d,或者是matrix而不是数组。

In [174]: A1=A.A1
In [175]: A1
Out[175]: array([1, 0, 0, 2, 3, 3, 3, 2, 3, 3, 0, 2, 3, 4, 4, 4])

np.unique可以为我们提供频率计数,因此我们可以使用(unique需要1d)来确定最常用的值:

In [179]: u,c = np.unique(A1, return_counts=True)
In [180]: u
Out[180]: array([0, 1, 2, 3, 4])
In [181]: c
Out[181]: array([3, 1, 3, 6, 3])
In [182]: np.argmax(c)
Out[182]: 3
In [183]: u[np.argmax(c)]
Out[183]: 3

我很惊讶Divakar使用scipy mode代替unique。他是使用unique的专家。 :)

Divakar使用np.where可能是执行替换的最简单方法。

只是为了它的乐趣,这是一个蒙面数组方法:

In [196]: np.ma.MaskedArray(A, A!=3)
Out[196]: 
masked_matrix(data =
 [[-- -- -- --]
 [3 3 3 --]
 [3 3 -- --]
 [3 -- -- --]],
              mask =
 [[ True  True  True  True]
 [False False False  True]
 [False False  True  True]
 [False  True  True  True]],
        fill_value = 999999)
In [197]: _.filled(0)
Out[197]: 
matrix([[0, 0, 0, 0],
        [3, 3, 3, 0],
        [3, 3, 0, 0],
        [3, 0, 0, 0]])

或就地改变:

In [199]: A[A!=3] = 0
In [200]: A
Out[200]: 
matrix([[0, 0, 0, 0],
        [3, 3, 3, 0],
        [3, 3, 0, 0],
        [3, 0, 0, 0]])

答案 3 :(得分:0)

首先,压扁它:

flat = A.flatten[0]
# flat = [1, 0, 0, 2, .. ]

然后,找到列表的模式:

Finding the mode of a list

替换无模式:

B = A.copy()
B[B != mode] = 0