来自逐元素逻辑比较的 MATLAB 逻辑矩阵的 Python 等效项
Posted
技术标签:
【中文标题】来自逐元素逻辑比较的 MATLAB 逻辑矩阵的 Python 等效项【英文标题】:Python-equivalent of MATLAB logical matrix from element-wise logical comparison 【发布时间】:2022-01-07 08:39:25 【问题描述】:我正在从 MATLAB 过渡到 Python,并且正在寻找一种快速的方法来实现 MATLAB 的数组逻辑比较。这是我的意思的一个例子:
% Generate row vector, a, counting from 1 to 5.
>> a = 1:5;
% Generate row vector, b.
>> b = [1, 5, 4, 4, 7, 8, 1, 3,2, 10];
% Generate a 10x5 matrix which has the logical 1 (True) where the values of the two arrays are equal, and logical 0 (False) otherwise.
>> a == b'
ans =
10×5 logical array
1 0 0 0 0
0 0 0 0 1
0 0 0 1 0
0 0 0 1 0
0 0 0 0 0
0 0 0 0 0
1 0 0 0 0
0 0 1 0 0
0 1 0 0 0
0 0 0 0 0
我曾尝试使用np.where
和其他直接形式的索引,但我似乎无法正确模仿 MATLAB 的行为。特别是,我想避免使用 for
循环(或任何列表理解)和任何使用 pandas
以优化性能。
有谁知道这是如何以最佳方式完成的?
【问题讨论】:
a[...,None] == b
?
where
只是说明条件数组在哪里为真。它的使用不会添加任何东西。你用什么代替b'
? numpy 一维数组不会随着transpose
而改变。 1d 仍然是 1d。 matlab 总是有 2d。
不要“进行过渡”。拥抱两者:-)
【参考方案1】:
所以,我确实得到了一个解决方案,我不确定它是否真的是最好的,但无论如何。
a = np.arange(1,6)
b = np.array([1, 5, 4, 4, 7, 8, 1, 3, 2, 10]).reshape(1, 10)
% or b = np.array([[1, 5, 4, 4, 7, 8, 1, 3, 2, 10]])
print(a==b.T)
[[ True False False False False]
[False False False False True]
[False False False True False]
[False False False True False]
[False False False False False]
[False False False False False]
[ True False False False False]
[False False True False False]
[False True False False False]
[False False False False False]]
【讨论】:
(np.array(b)[:, None] == a) + 0
你可以直接将b
重塑为(10,1)。无论如何,这是正确的想法,将 (5,) 与 (10,1) 进行比较以获得 (10,5) 数组。以上是关于来自逐元素逻辑比较的 MATLAB 逻辑矩阵的 Python 等效项的主要内容,如果未能解决你的问题,请参考以下文章