Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用矩阵代换矩阵_Python_Numpy_Matrix_Sympy_Numpy Ndarray - Fatal编程技术网

Python 用矩阵代换矩阵

Python 用矩阵代换矩阵,python,numpy,matrix,sympy,numpy-ndarray,Python,Numpy,Matrix,Sympy,Numpy Ndarray,我正在使用pythTB研究石墨烯的紧束缚模型。我想在计算中加入完整的元素。rashba跳跃项的哈密顿量有泡利自旋矩阵向量与站点跳跃向量交叉 最初,我创建了一个矩阵列表,并将其与向量进行了交叉,不幸的是,这并没有产生正确的结果(我认为在向量交叉积被取下之后,矩阵的交叉积被取下) 接下来,我声明了3个符号‘s_x’、‘s_y’和‘s_z’,并用它们代替泡利自旋矩阵向量中的矩阵。取叉积后,我得到了正确的结果。我遇到的问题是,我无法将矩阵替换为我添加的变量符号。有可能这样做吗?或者我需要手动获取交叉积吗

我正在使用pythTB研究石墨烯的紧束缚模型。我想在计算中加入完整的元素。rashba跳跃项的哈密顿量有泡利自旋矩阵向量与站点跳跃向量交叉

最初,我创建了一个矩阵列表,并将其与向量进行了交叉,不幸的是,这并没有产生正确的结果(我认为在向量交叉积被取下之后,矩阵的交叉积被取下)

接下来,我声明了3个符号‘s_x’、‘s_y’和‘s_z’,并用它们代替泡利自旋矩阵向量中的矩阵。取叉积后,我得到了正确的结果。我遇到的问题是,我无法将矩阵替换为我添加的变量符号。有可能这样做吗?或者我需要手动获取交叉积吗

以下是我的一些代码:

from __future__ import print_function
from pythtb import * # import TB model class
from sympy import symbols
import numpy as np
import matplotlib.pyplot as plt

# create list of pauli spin matrices 
sx = [[0., 1.],[1., 0.]]
sy = [[0., -1.j],[1.j, 0.]]
sz = [[1., 0.],[0., -1.]]
Id = [[1., 0.], [0., 1.]]
s_pauli = np.zeros((4, 2, 2), dtype=complex)
s_pauli = [Id, sx, sy, sz]

# create s_pauli without identity matrix
s_pau = np.zeros((3, 2, 2), dtype=complex)
s_pau = [ s_x, s_y, s_z]

ab00 = [ 0.5, 0.28867513, 0.]

sig_x_ab00 = np.cross( s_pau, ab00)
如果我打印
sig_x_ab00[2]
(这是我目前唯一感兴趣的),那么我会得到:

0.288675134594813*s_x - 0.5*s_y
在获得这些信息之后,我想通过执行以下命令,用
s_pauli[1]
替换
s_x
,用
s_pauli[2]
替换
s_y

sig_x_ab00_ = sig_x_ab00.subs(s_x, s_pauli[1])
我得到以下错误输出:

AttributeError: 'numpy.ndarray' object has no attribute 'subs'
我所做的一切都是正确的吗?还是有更好的办法

非常感谢您的任何意见!
谢谢

让我们运行您的代码,但看看每个步骤。不要做假设

我使用的是
isympy
交互式环境;带有增强功能的
ipython
。我还导入了
np

In [4]: ab00 = [ 0.5, 0.28867513, 0.]                                           

In [5]: s_pauli                                                                 
Out[5]: 
[[[1.0, 0.0], [0.0, 1.0]],
 [[0.0, 1.0], [1.0, 0.0]],
 [[0.0, (-0-1j)], [1j, 0.0]],
 [[1.0, 0.0], [0.0, -1.0]]]
这是一份清单。前面的
np.zeros(…)
表达式不执行任何操作。在Python中,我们不设置变量的“类型”

我们可以从以下列表中创建一个数组:

In [6]: np.array(s_pauli)                                                       
s_pauli[1]
之所以有效,是因为它只是列表索引

以及添加的符号:

In [11]: s_x, s_y, s_z = symbols('s_x s_y s_z')                                 

In [12]: s_x                                                                    
Out[12]: sₓ

In [13]: s_pau = [ s_x, s_y, s_z]                                               
同样,
s_pau
是一个列表,而不是数组。在
cross
中使用时,它将变成一个数组:

In [14]: np.array(s_pau)                                                        
Out[14]: array([s_x, s_y, s_z], dtype=object)
请注意,这是一个对象数据类型数组,它仍然非常类似于列表。一些基本的数学是有效的,因为像乘法和加法这样的数学是为符号定义的。但是像
np.log
np.sin
这样的超验函数不适用于这样的数组

cross
仅使用乘法和加法,因此它可用于以下对象数组:

In [15]: sig = np.cross( s_pau, ab00)                                           

In [16]: sig                                                                    
Out[16]: array([-0.28867513*s_z, 0.5*s_z, 0.28867513*s_x - 0.5*s_y], dtype=object)
sig
是一个numpy数组。它不是sympy表达式,也没有
subs
方法。同样,密切关注正在发生的事情是值得的

数组的元素是symphy表达式:

In [17]: sig[2]                                                                 
Out[17]: 0.28867513⋅sₓ - 0.5⋅s_y

In [20]: s2 = sig[2]                                                            
具有标量值的SUB起作用:

In [22]: s2.subs(s_x, 1)                                                        
Out[22]: 0.28867513 - 0.5⋅s_y
但没有一份清单

In [23]: s2.subs(s_x, s_pauli[1])                                               
Out[23]: 0.28867513⋅sₓ - 0.5⋅s_y
但是,如果我从它生成Symphy矩阵:

In [24]: s_pauli[1]                                                             
Out[24]: [[0.0, 1.0], [1.0, 0.0]]

In [25]: Matrix(s_pauli[1])                                                     
Out[25]: 
⎡0.0  1.0⎤
⎢        ⎥
⎣1.0  0.0⎦

In [26]: s2.subs(s_x, Out[25])                                                  
Out[26]: 
           ⎡    0       0.28867513⎤
-0.5⋅s_y + ⎢                      ⎥
           ⎣0.28867513      0     ⎦
替代确实有效

通常,混合
sympy
numpy
是命中或未命中的;有些东西起作用了,几乎更多的是出于偶然,而不是出于设计。其他人则不然
sympy.lambdify
是制作可与numpy阵列一起使用的函数的最可靠的方法


在这种情况下,我怀疑您最好使用sympy版本的
cross
,并执行
sympy.Matrix
替换。

numpy
不知道
sympy
cross
之所以有效,是因为
np.array(s_pau)
是一个对象数据类型arrray,简单的数学被委托给元素自己的数学方法。但是
sig_x_ab00
是一个对象数组,而不是一个sympy表达式。混合numpy和sympy是一个命中或未命中的任务;有时有效,有时无效。最好坚持使用其中一种,而不是混合使用它们。在Python中,您不为变量定义类型。那些
np.zero(…)
行对您没有任何帮助。看看
supauli
supau
;它们是什么?