首页 > 解决方案 > Python 中的 3d 函数和矩阵——我应该使用 NumPy 吗?

问题描述

我是 Python 和编程的新手,我试图了解通常如何处理具有内部关系的数组。我尝试使用二维和三维列表制作一个乘法表,并得到了这个(最多为 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 中做同样事情的方法。我也不确定如何进行概括,以便可以输入输出的维度,而不必嵌套列表推导。有没有更简单/更好的方法来生成带有 Python 函数的多维数组?

标签: pythonarraysnumpymatrixdimension

解决方案


使用或不使用 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

推荐阅读