python - 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 函数的多维数组?
解决方案
使用或不使用 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
推荐阅读
- python - 隐蔽时间戳 obj 浮动
- discord - 全局聊天 - 静音命令
- c++ - 如何在下面的代码中返回指向children[poz]的父节点的指针?
- angular - Angular + Ionic 动态拖放到不同的列表
- python - 如何计算参数曲线的最小值?
- javascript - 在 leboncoin 刮板节点 js leboncoin-api 中更改类别 ID
- c++ - 在函数调用中检测特定的继承者
- node.js - AWS Lambda 监听 kafka 消息
- json - jq代码重写URL,其中一些值是数组和一些字符串
- twitter-bootstrap - 更改引导轮播指示器