从字符串输入列表构造numpy数组

从字符串输入列表构造numpy数组,numpy,Numpy,这是我第一次在这里问一些问题,所以我希望我用最好的方式来阐述这个问题 我已经学习python好几个月了,我决定用它来解决一个我必须解决的问题。它涉及到一些线性代数,所以我会先尝试建立数学模型。基本上,假设你在某种基础上得到了一个向量(简而言之,我会用二维来写所有东西),我们把它写成 v = (a*e_1 + b*e_2, c*e_1 + d*e_2) 这意味着我可以得到v作为向量(e_1,e_2)和2x2矩阵((a,b),(c,d))的乘积。现在,我的问题是:给定向量v,我想提取矩阵((a,b

这是我第一次在这里问一些问题,所以我希望我用最好的方式来阐述这个问题

我已经学习python好几个月了,我决定用它来解决一个我必须解决的问题。它涉及到一些线性代数,所以我会先尝试建立数学模型。基本上,假设你在某种基础上得到了一个向量(简而言之,我会用二维来写所有东西),我们把它写成

v = (a*e_1 + b*e_2, c*e_1 + d*e_2)
这意味着我可以得到v作为向量(e_1,e_2)和2x2矩阵((a,b),(c,d))的乘积。现在,我的问题是:给定向量v,我想提取矩阵((a,b),(c,d))并将其放入一个numpy数组中。因为最终我将需要对向量列表执行此操作,所以我希望能够提供一个列表作为输入,其中包含代表向量的字符串形式的条目,例如:

vector = [2*e_1, -e_1 + e_2]
作为输出得到矩阵,作为一个numpy数组,它将“向量”投影到基上,也就是

matrix = np.array([[2, 0], [-1, 2]])
这可能吗?如果是的话,有人能给我指出正确的方向吗?我已经盯着屏幕看了一段时间,还不知道怎么做,所以任何提示都将非常感谢

编辑:

所以,感谢到目前为止所有回答的人。让我进一步阐述我的问题,以及我想用它做什么

作为输入,我有一组向量,其分量都是一组基向量(k1,k2,…,kn)的线性组合,其系数在集合(+1,-1,0)中。这组向量的大小为N,其中通常N>=N。然后,给定n个输入向量中的n个向量的选择,我可以将这些n个向量视为(k1',k2',…,kn')一个新的基,并计算从基(k1,k2,…,kn)转换到新基(k1',k2',…,kn')的矩阵。此外,我可以通过另一个n个向量的第二个选择来实现这一点,并将变换矩阵转换为第三个基(k1'',k2'',…,kn'')

我的问题真正需要的是找到从基b1=(k1',k2',…,kn')转换为基b2=(k1'',k2'',…,kn'')的矩阵,假设输入写在基b=(k1,k2,…,kn')中。然而,我知道如果我为一些矩阵A和B写b1=Ab和b2=Bb,我可以通过找到B的逆矩阵并写C=A*B^{-1}来找到关系b1=Cb2中的矩阵C。在发布了这个问题并玩了一些东西之后,我想到了以下代码:

将numpy导入为np
进口itertools
输入向量=['+l1','+l2'],['+l1+l2','+l1']]
dim=len(输入向量)
矩阵列表=[np.输入向量中i的零((dim,dim)]]
对于zip中的元素(输入向量、矩阵列表):
动量=元素[0]
矩阵=元素[1]
如果以动量[0]为单位的“+l1”:
矩阵[0][0]=1
如果以动量[0]表示的“+l2”:
矩阵[0][1]=1
如果以动量[0]表示的“-l1”:
矩阵[0][0]=-1
如果以动量[0]表示的“-l2”:
矩阵[0][1]=-1
如果以动量[1]表示的“+l1”:
矩阵[1][0]=1
如果动量[1]中的“+l2”:
矩阵[1][1]=1
如果以动量[1]表示的“-l1”:
矩阵[1][0]=-1
如果以动量[1]表示的“-l2”:
矩阵[1][1]=-1

这实际上产生了我想要的输出。然而,它看起来非常多余,显然不容易推广。

你想用这个线性代数做什么?所以你想把这个
[2*e_1,-e_1+e_2]
作为输入,把这个
np.array([[2,0],-1,2]])
作为输出

解析字符串太痛苦了,所以假设您刚刚用Python编写了该表达式(如果不使用exec):

string_expression=“[2*e_1,-e_1+e_2]”如果从文件或输入读取字符串
e_1=np.数组([1,0])#这些向量需要在求值之前定义
e_2=np.array([0,1])
python_expression=eval(string_expression)#如果您自己编写python表达式,就不需要这个,就像这样
#python_表达式=[2*e_1,-e_1+e_2]#这更简单
矩阵=np.array(python_表达式)
如果您想要更通用的方法:

def get_matrix(string_expression, dims, vector_name='e'):
     for i in range(dims):
          base = np.zeros(dims)
          base[i] = 1 # It just a vector in the form [0, 0, ... ,1, ... 0, 0]
          base_name = '%s_%d' % (vector_name, i+1) # string for e_i
          locals()[base_name] = base # create a local variable named e_i
     expression = eval(string_expression) # evaluates the string as Python code
     return np.array(expression) # Create a matrix from the list of arrays

get_matrix('[2*e_1, -e_1 + e_2]', 2, 'e') # returns np.array([[2, 0], [-1, 1]])
get_matrix('[l_1+l2, l_1]', 2, 'l') # returns np.array([[1, 1], [1, 0]])

您目前如何在python中表示
vector=[2*e_1,-e_1+e_2]
?e_1和e_2的数据类型是什么?目前,我正在考虑将e_1和e_2表示为字符串(问题中e_1和e_2的实际系数总是等于1,-1或0,但我需要一些东西来区分e_1和e_2)。然而,我甚至不知道这是否是最好的方法。哇,我只是对你的示例
np.array([[2,0],-1,2]])
感到困惑,它真的是最后一个位置的2吗?你的矩阵变换了吗?非常感谢你的回答!我刚刚对原始问题进行了编辑,希望这有助于我的问题和动机更加清晰。不过,我有一个问题:matrix=np.array(python\u expression).T中的.T是做什么的?我只对numpy做了一些基本的工作,所以我对语法和方法知之甚少。t是np.transpose的缩写。这个答案有用吗?我还制作了一个通用函数,它接受任何python表达式。您应该知道向量的标识值(一个热编码)是创建矩阵的原因。嗨!谢谢你的回答!我刚回到这里,它确实起到了作用。我以前并不完全理解这个逻辑,所以我对此很好奇。