我正在寻找一些内置的 NumPy 模块或一些矢量化方法来通过 n 矩阵为 n>1 获得这样的 n。这里唯一的关键是给定行的最后一个元素充当下一行的第一个元素。
n = 2
# array([[1, 2],
# [2, 3]])
n = 3
# array([[1, 2, 3],
# [3, 4, 5],
# [5, 6, 7]])
n = 4
# array([[1, 2, 3, 4],
# [4, 5, 6, 7],
# [7, 8, 9, 10],
# [10, 11, 12, 13]])
我的尝试 使用列表理解。也可以用扩展的 for 循环语法编写相同的内容。
import numpy as np
n = 4
arr = np.array([[(n-1)*j+i for i in range(1, n+1)] for j in range(n)])
# array([[ 1, 2, 3, 4],
# [ 4, 5, 6, 7],
# [ 7, 8, 9, 10],
# [10, 11, 12, 13]])
请您参考如下方法:
如果你想让事情简单(并且有点可读),应该这样做:
def ranged_mat(n):
out = np.arange(1, n ** 2 + 1).reshape(n, n)
out -= np.arange(n).reshape(n, 1)
return out
只需构建从 1 到 n² 的所有数字,将它们重新整形为所需的 block 形状,然后从每一行中减去行号。
这与 Divakar 的 ranged_mat_v2 相同,但我喜欢明确显示中间数组形状。并非每个人都是 NumPy 广播规则的专家。
