gpt4 book ai didi

python - 在 Python 中将列表列表转换为数组

转载 作者:行者123 更新时间:2023-12-01 04:01:28 24 4
gpt4 key购买 nike

我一直在查找此内容,但找不到任何有帮助的内容。我在制作所需大小的数组时遇到了一些麻烦。

到目前为止,我已经使用以下代码创建了一个列表列表:

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) 的数组?

最佳答案

欢迎来到 numpy 世界。

看来你想要:

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

在构建列表列表时,很难考虑行和列索引。在 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

关于python - 在 Python 中将列表列表转换为数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36424159/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com