Python 中的 3d 函数和矩阵——我应该使用 NumPy 吗?
3d functions and matrices in Python -- should I use NumPy?
我是 Python 和编程的新手,正在尝试了解通常如何处理具有内部关系的数组。我尝试使用二维和三维列表进行乘法 table 并得到这个(对于乘法 table 最多 4):
n = 4
a = [x for x in range(1,n+1)]
b = [x for x in range(1,n+1)]
mp_table = []
for i in a:
c = []
for j in b:
c.append(i*j)
mp_table.append(c)
print(mp_table)
这会按预期输出 [[1, 2, 3, 4], [2, 4, 6, 8], [3, 6, 9, 12], [4, 8, 12, 16]] .
此代码在三个维度上有效:
n = 4
a = [x for x in range(1,n+1)]
b = [x for x in range(1,n+1)]
mp_table = []
for i in a:
c = []
for j in b:
c.append([i*j*t for t in range(1, n+1)])
mp_table.append(c)
print(mp_table)
输出:
[[[1, 2, 3, 4], [2, 4, 6, 8], [3, 6, 9, 12], [4, 8, 12, 16]], [[2, 4, 6, 8], [4, 8, 12, 16], [6, 12, 18, 24], [8, 16, 24, 32]], [[3, 6, 9, 12], [6, 12, 18, 24], [9, 18, 27, 36], [12, 24, 36, 48]], [[4, 8, 12, 16], [8, 16, 24, 32], [12, 24, 36, 48], [16, 32, 48, 64]]]
但是,我一直没能找到在 NumPy 中做同样事情的方法。我也不确定如何概括,以便可以输入输出的维度,而不必嵌套列表理解。是否有 easier/better 方法来生成具有 Python 中的函数的多维数组?
使用或不使用 numpy,都不需要声明数组 a 和 b。为了避免使用理解的嵌套列表,请使用 numpy.zeros
看这个解决方案:
对于二维:
import numpy as np
n = 4
mp_table = np.zeros((n, n), dtype=np.uint16)
for i in range(1, n+1):
for j in range(1, n+1):
mp_table[i-1][j-1] = i*j
print(mp_table)
输出:
[[ 1 2 3 4]
[ 2 4 6 8]
[ 3 6 9 12]
[ 4 8 12 16]]
对于 3d 几乎相同,但多了一个循环:
import numpy as np
n = 4
mp_table = np.zeros((n, n, n), dtype=np.uint16)
for i in range(1, n+1):
for j in range(1, n+1):
for k in range(1, n+1):
mp_table[i-1][j-1][k-1] = i*j*k
print(mp_table)
输出:
[[[ 1 2 3 4]
[ 2 4 6 8]
[ 3 6 9 12]
[ 4 8 12 16]]
...
[[ 4 8 12 16]
[ 8 16 24 32]
[12 24 36 48]
[16 32 48 64]]]
编辑:如果您希望代码看起来漂亮,您也可以在一行中构造每个矩阵:
[np.linspace(i, n*i, n, dtype=np.uint16) for i in range(1, n+1)] # 2D
[[np.linspace(i*j, n*i*j, n, dtype=np.uint16) for i in range(1, n+1)] for j in range(1, n+1)] # 3D