回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>在本例中,我希望能够使用Python类作为元素执行矩阵操作,这是一个简单的<a href="http://en.wikipedia.org/wiki/Galois_field" rel="nofollow">Galois field</a>实现。它实现了必需的<code>__add__</code>、<code>__mul__</code>、<code>__sub__</code>等</p>
<p>起初,我认为这应该可以通过<a href="http://docs.scipy.org/doc/numpy/reference/arrays.ndarray.html" rel="nofollow">numpy arrays</a>使用<code>dtype</code>参数实现,但是从<a href="http://docs.scipy.org/doc/numpy/reference/arrays.dtypes.html" rel="nofollow">the ^{<cd4>} documentation</a>来看,似乎<code>dtype</code>不能是任意的Python类。例如,我有一个类<code>Galois</code>,它执行模块2的操作:</p>
<pre><code>>>> from galois import Galois
>>> Galois(1) + Galois(0)
Galois(1)
>>> Galois(1) + Galois(1)
Galois(0)
</code></pre>
<p>我可以试着在纽比用这个:</p>
<pre><code>>>> import numpy as np
>>> a = np.identity(4, Galois)
>>> a
array([[1, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 1]], dtype=object)
</code></pre>
<p>但是,如果我对矩阵执行操作,元素就不会遵循类的方法:</p>
<pre><code>>>> b = np.identity(4, Galois)
>>> a+b
array([[2, 0, 0, 0],
[0, 2, 0, 0],
[0, 0, 2, 0],
[0, 0, 0, 2]], dtype=object)
</code></pre>
<p>有没有办法让这和努比一起工作?</p>
<p>是否有其他Python矩阵库可以对任意数类进行矩阵运算(包括反转)?</p>
<h3>更新</h3>
<p>谢谢你到目前为止的回答。但我还是不能像我希望的那样真正使用它。加法和乘法看起来不错,但不是矩阵求逆。例如,让我们尝试从<a href="http://en.wikipedia.org/wiki/Rijndael_S-box#Forward_S-box" rel="nofollow">forward S-box affine transform matrix</a>中获取<a href="http://en.wikipedia.org/wiki/Rijndael_S-box#Inverse_S-box" rel="nofollow">AES inverse S-box affine transform matrix</a>。</p>
<pre><code>class Galois(object):
MODULO = 2
def __init__(self, val):
self.val = int(val) % self.MODULO
def __add__(self, val):
return self.__class__((self.val + int(val)) % self.MODULO)
def __sub__(self, val):
return self.__class__((self.val - int(val)) % self.MODULO)
def __mul__(self, val):
return self.__class__((self.val * int(val)) % self.MODULO)
def __int__(self):
return self.val
def __repr__(self):
return "%s(%d)" % (self.__class__.__name__, self.val)
def __float__(self):
return float(self.val)
if __name__ == "__main__":
import numpy as np
Gv = np.vectorize(Galois)
a = Gv(np.identity(8)) + Gv(np.eye(8,8,-1)) + Gv(np.eye(8,8,-2)) + Gv(np.eye(8,8,-3)) + Gv(np.eye(8,8,-4)) + Gv(np.eye(8,8,4)) + Gv(np.eye(8,8,5)) + Gv(np.eye(8,8,6)) + Gv(np.eye(8,8,7))
print np.matrix(a)
print np.matrix(a).I
</code></pre>
<p>结果是:</p>
<pre><code>[[Galois(1) Galois(0) Galois(0) Galois(0) Galois(1) Galois(1) Galois(1)
Galois(1)]
[Galois(1) Galois(1) Galois(0) Galois(0) Galois(0) Galois(1) Galois(1)
Galois(1)]
[Galois(1) Galois(1) Galois(1) Galois(0) Galois(0) Galois(0) Galois(1)
Galois(1)]
[Galois(1) Galois(1) Galois(1) Galois(1) Galois(0) Galois(0) Galois(0)
Galois(1)]
[Galois(1) Galois(1) Galois(1) Galois(1) Galois(1) Galois(0) Galois(0)
Galois(0)]
[Galois(0) Galois(1) Galois(1) Galois(1) Galois(1) Galois(1) Galois(0)
Galois(0)]
[Galois(0) Galois(0) Galois(1) Galois(1) Galois(1) Galois(1) Galois(1)
Galois(0)]
[Galois(0) Galois(0) Galois(0) Galois(1) Galois(1) Galois(1) Galois(1)
Galois(1)]]
[[ 0.4 0.4 -0.6 0.4 0.4 -0.6 0.4 -0.6]
[-0.6 0.4 0.4 -0.6 0.4 0.4 -0.6 0.4]
[ 0.4 -0.6 0.4 0.4 -0.6 0.4 0.4 -0.6]
[-0.6 0.4 -0.6 0.4 0.4 -0.6 0.4 0.4]
[ 0.4 -0.6 0.4 -0.6 0.4 0.4 -0.6 0.4]
[ 0.4 0.4 -0.6 0.4 -0.6 0.4 0.4 -0.6]
[-0.6 0.4 0.4 -0.6 0.4 -0.6 0.4 0.4]
[ 0.4 -0.6 0.4 0.4 -0.6 0.4 -0.6 0.4]]
</code></pre>
<p>不是我希望的结果。对于矩阵求逆,numpy把矩阵转换成浮点数,然后用纯实数进行求逆。</p>