2016-04-05 117 views
1

我一直在寻找这个,但我找不到任何帮助。我在制作一个我想要的大小的数组时遇到了一些麻烦。在Python中将列表列表转换为数组

到目前为止,我已经创建了一个列表的列表与此代码:

n=4 
def matrixA(k): 
    A=[] 
    for m in range(0,k): 
     row=[] 
     #A.append([]) 
     for n in range(0,k): 
      if (n==(m+1)) or (n==(m-1)): 
       row.append(-deltaX/(deltaX)**2) 
      if (n==m): 
       row.append(2*deltaX/(deltaX)**2) 
      else: 
       row.append(0) 
     A.append(row) 
    return A 
pprint.pprint(matrixA(n)) 
print len(matrixA(n)) 

我得到这个输出。

[[128.0, -64.0, 0, 0, 0], 
[-64.0, 0, 128.0, -64.0, 0, 0], 
[0, -64.0, 0, 128.0, -64.0, 0], 
[0, 0, -64.0, 0, 128.0]] 
4 

现在,我想使这个数组的大小(4,4)。我的问题是,当我这样做(列表转换为一个数组,并试图塑造它):

A=numpy.array(matrixA(n)) 
print A 
print "This is its shape:",A.shape 
A.shape=(n,n) 

我获得:

[[128.0, -64.0, 0, 0, 0] [-64.0, 0, 128.0, -64.0, 0, 0] 
[0, -64.0, 0, 128.0, -64.0, 0] [0, 0, -64.0, 0, 128.0]] 
This is its shape: (4,) 

然后一个错误:

ValueError: total size of new array must be unchanged 

我该如何从这里得到一个大小为(4,4)的数组呢?

+3

您的清单有5或6个元素,您打算如何将其制作成4x4阵列?另外,由于列表中元素的数量不同,'numpy'不会创建2D数组,而是会创建一个由d列= object组成的1D数组。 – fjarri

+0

哇,我不敢相信我没注意到。你知道为什么这里有5或6个,而不是5个?(我也改变了从k到k-1的范围,因为你指出这是因为我希望它是4而不是5,谢谢。) –

+2

我猜想循环内的第二个'if'应该是'elif '。目前您在一次迭代中有时会追加到'row'两次。另外,你正在覆盖'n',不知道你是否想要。 – fjarri

回答

0

转换嵌套列表到一个数组很简单,和你做正确:

numpy.array(matrixA(n))

它不工作的原因是因为你实际上产生嵌套列表具有不规则数“列”

有问题的部分是因为你缺少一个elif

if (n==(m+1)) or (n==(m-1)): 
    row.append(-deltaX/(deltaX)**2) 
if (n==m): 
    row.append(2*deltaX/(deltaX)**2) 

将您的循环更改为:

for m in range(0,k-1): 
    row=[] 
    #A.append([]) 
    for n in range(0,k-1): 
     if (n==(m+1)) or (n==(m-1)): 
      row.append(-deltaX/(deltaX)**2) 
     elif (n==m): 
      row.append(2*deltaX/(deltaX)**2) 
     else: 
      row.append(0) 
    A.append(row) 
+0

我很确定有问题的部分是下一行,它应该是'elif',而不是'if'。 –

+0

是的,我太急于点击提交按钮;) – Simon

2

欢迎来到世界各地。

看来你想:

array([[ 128., -64., 0., 0.], 
     [ -64., 128., -64., 0.], 
     [ 0., -64., 128., -64.], 
     [ 0., 0., -64., 128.]]) 

这是很难想象的行和建名单列表时的cols指数看。在numpy中,你先塑造,然后填充,这通常更容易。

循序渐进:

In [37]: from numpy import eye,diag,ones # some useful functions 

In [38]: eye(4) # identity matrix 
Out[38]: 
array([[ 1., 0., 0., 0.], 
     [ 0., 1., 0., 0.], 
     [ 0., 0., 1., 0.], 
     [ 0., 0., 0., 1.]]) 

In [39]: eye(4)*128 
Out[39]: 
array([[ 128., 0., 0., 0.], 
     [ 0., 128., 0., 0.], 
     [ 0., 0., 128., 0.], 
     [ 0., 0., 0., 128.]]) 

In [40]: ones(3) 
Out[40]: array([ 1., 1., 1.]) 

In [41]: diag(ones(3),1) # see help(diag) 
Out[41]: 
array([[ 0., 1., 0., 0.], 
     [ 0., 0., 1., 0.], 
     [ 0., 0., 0., 1.], 
     [ 0., 0., 0., 0.]]) 

In [42]: diag(ones(3),1).T # transpose 
Out[42]: 
array([[ 0., 0., 0., 0.], 
     [ 1., 0., 0., 0.], 
     [ 0., 1., 0., 0.], 
     [ 0., 0., 1., 0.]]) 

所以,你想的是一样的东西:

def arrayA(n,deltaX): 
    A=eye(n) # id matrix of size n 
    B= diag(ones(n-1),1) # just ahead 
    return (2*A-B-B.T)*(deltaX/deltaX**2) 

并运行:

In [45]: arrayA(4,1/64) 
Out[45]: 
array([[ 128., -64., 0., 0.], 
     [ -64., 128., -64., 0.], 
     [ 0., -64., 128., -64.], 
     [ 0., 0., -64., 128.]]) 

而对于大的矩阵,这是速度快:

In [57]: %timeit arrayA(100,1/64) 
1000 loops, best of 3: 326 µs per loop 

In [58]: %timeit matrixA(100) 
100 loops, best of 3: 14.9 ms per loop 
相关问题