来自逐元素逻辑比较的 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 等效项的主要内容,如果未能解决你的问题,请参考以下文章

matlab学习3

Matlab-使用逻辑值进行索引

matlab 二维矩阵for循环逐行赋值

MatLab数据结构

matlab矩阵里有很多有相同值的元素,如何剔除多余的,每个值只留一个元素

matlab:获取特定逻辑矩阵的所有排列