【问题标题】:With a python matrix M (using numpy), how can I compare each column of that matrix with all other columns?使用 python 矩阵 M(使用 numpy),如何将该矩阵的每一列与所有其他列进行比较?
【发布时间】:2015-05-01 11:01:58
【问题描述】:

我想看看是否有一种方法可以在不使用循环的情况下将矩阵的列与同一矩阵的所有其他列进行比较。显然,结果可能非常大,并且对于 [m x n] 矩阵的大小将随着 n**2 增长。但在合理的值 n 下,它是有希望的。

具体来说,我有一个像这样的矩阵:

|  1  -1  1  1  -1 |
| -1  -1  1  1   1 |
| -1   1 -1 -1   1 |
|  1  -1  1 -1   1 |

并且需要获取所有列组合的 AND 和 XOR 值(或其他逻辑比较)。这可能没有循环吗?我对 Python、R 和 Octave 比较陌生,但已经多次遇到类似的问题。因此,欢迎使用 Python 或其他语言的解决方案!

例子:

| 1 -1  1 |     | 2 0 2 0 -2 0 2 0  1 | 
| 1  1 -1 |  => | 2 2 0 2  2 0 0 0 -2 |
|-1  1  1 |     |-2 0 0 0  2 2 0 2  2 |

[第1列+矩阵,第2列+矩阵,第3列+矩阵]

它变得非常快。有很多重复,例如我不需要将一列添加到自身,我也不需要将每一列与所有其他列进行比较,但所有列号较高的列更好(在右侧边)。也许像上面的例子那样实现它更容易。也许这是不可能的!我可以想象这是一种快速吸收所有可用内存的功能!

【问题讨论】:

  • 你到底在比较什么,一列与列在同一位置?
  • 是的,我想以最简单的形式添加列。因此,比较第 1 列和第 2 列(我们称它们为 C1 和 C2)将得到向量 [0 -2 0 0](转置)。这样我就可以得出成对的 C1 AND C2、C1 OR C2 和 C1 XOR C2 等。或者我可以将矩阵中的值更改为零和一,并直接应用逻辑运算符。但要让它发挥作用,关键是要有一种方法来比较所有列对。谢谢!
  • 目前我所做的是从矩阵中获取列并将这些列与我正在比较的列右侧的所有列的子矩阵进行比较(这是因为在比较 C1 和 C3 之后,我会不需要比较 C3 和 C1。所以好消息是很容易将向量与矩阵相加/减去/比较(numpy 理解您可能意味着让向量对每一列进行操作),但我没有看到方法摆脱列上的循环。
  • @RemcoNiggebrugge 您能否为给定输入添加所需输出的示例?
  • 当然。上面的矩阵会给出一个很大的结果放在这里,所以一个小例子(我会添加它作为答案,因为我不能在这里添加富文本格式)

标签: python numpy matrix comparison-operators


【解决方案1】:

我不知道您的问题解决方案是否有一些内置机制。不过我有些东西可能对你有帮助。

import numpy as np
a = np.random.random_integers(0,6,(300,300))
b = np.random.random_integers(0,6,(300,300))

for i in xrange(300):
    a = np.roll(a, 1, axis=a)
    ###Do whatever you want to do with a and b

此处将生成矩阵 a 的所有组合,因此您可以根据自己的用途使用它。

你不想使用循环可能是因为时间效率。但是由于 numpy 改进的库,这会更快

我是第一次在 StackOverflow 上写答案。所以,如果你发现它错了,那么对不起!

引用:http://docs.scipy.org/doc/numpy/reference/generated/numpy.roll.html

【讨论】:

    猜你喜欢
    • 2019-05-23
    • 2014-01-18
    • 1970-01-01
    • 2017-08-05
    • 1970-01-01
    • 1970-01-01
    • 2020-02-24
    • 1970-01-01
    • 2013-06-29
    相关资源
    最近更新 更多