我是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代码,那将非常有用。
答案 0 :(得分:2)
使用axis
将None
设置为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, .. ]
然后,找到列表的模式:
替换无模式:
B = A.copy()
B[B != mode] = 0