Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Numpy使用任意维的方阵创建模式_Python_Arrays_Numpy_Matrix - Fatal编程技术网

Python Numpy使用任意维的方阵创建模式

Python Numpy使用任意维的方阵创建模式,python,arrays,numpy,matrix,Python,Arrays,Numpy,Matrix,我在尝试使用NumPy生成一个特定的模式时遇到了困难,该模式适用于任何正方形矩阵和任何正方形维度 例如: 用户输入:n=3 输出: [[1 2 0] [2 3 2] [0 2 1]] [[1 2 3 0 0] [2 3 4 0 0] [3 4 5 4 3] [0 0 4 3 2] [0 0 3 2 1]] [[1 2 3 4 5 0 0 0] [2 3 4 5 6 0 0 0] [3 4 5 6 7 0 0 0] [4 5 6 9 8 7 6 5] [5 6 7 8 9

我在尝试使用NumPy生成一个特定的模式时遇到了困难,该模式适用于任何正方形矩阵和任何正方形维度

例如:

用户输入:n=3

输出:

[[1 2 0]
 [2 3 2]
 [0 2 1]]
[[1 2 3 0 0]
 [2 3 4 0 0]
 [3 4 5 4 3]
 [0 0 4 3 2]
 [0 0 3 2 1]]
[[1 2 3 4 5 0 0 0]
 [2 3 4 5 6 0 0 0]
 [3 4 5 6 7 0 0 0]
 [4 5 6 9 8 7 6 5]
 [5 6 7 8 9 6 5 4]
 [0 0 0 7 6 5 4 3]
 [0 0 0 6 5 4 3 2]
 [0 0 0 5 4 3 2 1]]
[[1 2 3 0 0]
 [2 3 4 0 0]
 [3 4 5 0 0]
 [0 0 0 0 0]
 [0 0 0 0 0]]
[[1 2 0]
 [2 3 2]
 [0 2 1]]
[[1 2 3 0 0]
 [2 3 4 0 0]
 [3 4 5 4 3]
 [0 0 4 3 2]
 [0 0 3 2 1]]
[[1 2 3 4 5 0 0 0]
 [2 3 4 5 6 0 0 0]
 [3 4 5 6 7 0 0 0]
 [4 5 6 9 8 7 6 5]
 [5 6 7 8 9 6 5 4]
 [0 0 0 7 6 5 4 3]
 [0 0 0 6 5 4 3 2]
 [0 0 0 5 4 3 2 1]]
用户输入:n=5

输出:

[[1 2 0]
 [2 3 2]
 [0 2 1]]
[[1 2 3 0 0]
 [2 3 4 0 0]
 [3 4 5 4 3]
 [0 0 4 3 2]
 [0 0 3 2 1]]
[[1 2 3 4 5 0 0 0]
 [2 3 4 5 6 0 0 0]
 [3 4 5 6 7 0 0 0]
 [4 5 6 9 8 7 6 5]
 [5 6 7 8 9 6 5 4]
 [0 0 0 7 6 5 4 3]
 [0 0 0 6 5 4 3 2]
 [0 0 0 5 4 3 2 1]]
[[1 2 3 0 0]
 [2 3 4 0 0]
 [3 4 5 0 0]
 [0 0 0 0 0]
 [0 0 0 0 0]]
[[1 2 0]
 [2 3 2]
 [0 2 1]]
[[1 2 3 0 0]
 [2 3 4 0 0]
 [3 4 5 4 3]
 [0 0 4 3 2]
 [0 0 3 2 1]]
[[1 2 3 4 5 0 0 0]
 [2 3 4 5 6 0 0 0]
 [3 4 5 6 7 0 0 0]
 [4 5 6 9 8 7 6 5]
 [5 6 7 8 9 6 5 4]
 [0 0 0 7 6 5 4 3]
 [0 0 0 6 5 4 3 2]
 [0 0 0 5 4 3 2 1]]
用户输入:n=8

输出:

[[1 2 0]
 [2 3 2]
 [0 2 1]]
[[1 2 3 0 0]
 [2 3 4 0 0]
 [3 4 5 4 3]
 [0 0 4 3 2]
 [0 0 3 2 1]]
[[1 2 3 4 5 0 0 0]
 [2 3 4 5 6 0 0 0]
 [3 4 5 6 7 0 0 0]
 [4 5 6 9 8 7 6 5]
 [5 6 7 8 9 6 5 4]
 [0 0 0 7 6 5 4 3]
 [0 0 0 6 5 4 3 2]
 [0 0 0 5 4 3 2 1]]
[[1 2 3 0 0]
 [2 3 4 0 0]
 [3 4 5 0 0]
 [0 0 0 0 0]
 [0 0 0 0 0]]
[[1 2 0]
 [2 3 2]
 [0 2 1]]
[[1 2 3 0 0]
 [2 3 4 0 0]
 [3 4 5 4 3]
 [0 0 4 3 2]
 [0 0 3 2 1]]
[[1 2 3 4 5 0 0 0]
 [2 3 4 5 6 0 0 0]
 [3 4 5 6 7 0 0 0]
 [4 5 6 9 8 7 6 5]
 [5 6 7 8 9 6 5 4]
 [0 0 0 7 6 5 4 3]
 [0 0 0 6 5 4 3 2]
 [0 0 0 5 4 3 2 1]]
由于可以用(n x n)形式的任何数字生成方阵,因此可能会出现用户输入为奇数的情况,我如何开始计算使其工作所需的方程式


我做到了这一点,但我只能在矩阵的一个角落,任何建议或想法都将不胜感激,谢谢

输入:n=4

输出:

[[1 2 0]
 [2 3 2]
 [0 2 1]]
[[1 2 3 0 0]
 [2 3 4 0 0]
 [3 4 5 4 3]
 [0 0 4 3 2]
 [0 0 3 2 1]]
[[1 2 3 4 5 0 0 0]
 [2 3 4 5 6 0 0 0]
 [3 4 5 6 7 0 0 0]
 [4 5 6 9 8 7 6 5]
 [5 6 7 8 9 6 5 4]
 [0 0 0 7 6 5 4 3]
 [0 0 0 6 5 4 3 2]
 [0 0 0 5 4 3 2 1]]
[[1 2 3 0 0]
 [2 3 4 0 0]
 [3 4 5 0 0]
 [0 0 0 0 0]
 [0 0 0 0 0]]
[[1 2 0]
 [2 3 2]
 [0 2 1]]
[[1 2 3 0 0]
 [2 3 4 0 0]
 [3 4 5 4 3]
 [0 0 4 3 2]
 [0 0 3 2 1]]
[[1 2 3 4 5 0 0 0]
 [2 3 4 5 6 0 0 0]
 [3 4 5 6 7 0 0 0]
 [4 5 6 9 8 7 6 5]
 [5 6 7 8 9 6 5 4]
 [0 0 0 7 6 5 4 3]
 [0 0 0 6 5 4 3 2]
 [0 0 0 5 4 3 2 1]]

我不确定这些例子中的零的模式是什么。在n=3和n=5的情况下,角点中的零子阵列的大小为(n//2)x(n//2),但对于n=8,它们的大小为3x3,而不是4x4。假设这些子阵列的大小应为(n//2)x(n//2),则以下代码应该可以工作:

n = 7
A = np.zeros((n, n), dtype=int)
for i in range(n):
    A.ravel()[i:(n-i)*n:n+1] = n-i
m = n//2
A[:m, :m] = 0
A[-m:, -m:] = 0
A = A + A.T - np.diag(np.diag(A))
A = A[:, ::-1]
如果零子阵列应该更小,则只需更改
m

的值即可尝试以下操作:

def foo(n):
    half = (n+1) // 2
    res = np.zeros((n, n), int)
    res[:half, :half] = np.arange(1, 1 + half) + np.arange(half).reshape(half, 1)
    res[n//2:, n//2:] = res[half-1::-1, half-1::-1]
    return res
这将创建左上角四分之一,然后将其镜像到右下角四分之一

注意,它的行为与您的示例n=8略有不同,输出为:

  [[1, 2, 3, 4, 0, 0, 0, 0],
   [2, 3, 4, 5, 0, 0, 0, 0],
   [3, 4, 5, 6, 0, 0, 0, 0],
   [4, 5, 6, 7, 0, 0, 0, 0],
   [0, 0, 0, 0, 7, 6, 5, 4],
   [0, 0, 0, 0, 6, 5, 4, 3],
   [0, 0, 0, 0, 5, 4, 3, 2],
   [0, 0, 0, 0, 4, 3, 2, 1]]

但我会这样说,因为它看起来更符合逻辑……如果需要,您可以编辑代码,以使中间的4个值如您所示相互混合。

我环顾了一下四周,最终成功了,以下是我的看法。

import numpy as np


def input_number(n):
    matrix = np.zeros(shape=(n, n), dtype=int)

    for y in range(round(n // 2) + 1):
        for x in range(round(n // 2) + 1):
            matrix[y, x] = y + x + 1
            matrix[(n - y) - 1][(n - x) - 1] = matrix[y, x]

    print(matrix)


input_number(n)
输入:3

输出:

[[1 2 0]
 [2 3 2]
 [0 2 1]]
[[1 2 3 0 0]
 [2 3 4 0 0]
 [3 4 5 4 3]
 [0 0 4 3 2]
 [0 0 3 2 1]]
[[1 2 3 4 5 0 0 0]
 [2 3 4 5 6 0 0 0]
 [3 4 5 6 7 0 0 0]
 [4 5 6 9 8 7 6 5]
 [5 6 7 8 9 6 5 4]
 [0 0 0 7 6 5 4 3]
 [0 0 0 6 5 4 3 2]
 [0 0 0 5 4 3 2 1]]
[[1 2 3 0 0]
 [2 3 4 0 0]
 [3 4 5 0 0]
 [0 0 0 0 0]
 [0 0 0 0 0]]
[[1 2 0]
 [2 3 2]
 [0 2 1]]
[[1 2 3 0 0]
 [2 3 4 0 0]
 [3 4 5 4 3]
 [0 0 4 3 2]
 [0 0 3 2 1]]
[[1 2 3 4 5 0 0 0]
 [2 3 4 5 6 0 0 0]
 [3 4 5 6 7 0 0 0]
 [4 5 6 9 8 7 6 5]
 [5 6 7 8 9 6 5 4]
 [0 0 0 7 6 5 4 3]
 [0 0 0 6 5 4 3 2]
 [0 0 0 5 4 3 2 1]]
输入:5

输出:

[[1 2 0]
 [2 3 2]
 [0 2 1]]
[[1 2 3 0 0]
 [2 3 4 0 0]
 [3 4 5 4 3]
 [0 0 4 3 2]
 [0 0 3 2 1]]
[[1 2 3 4 5 0 0 0]
 [2 3 4 5 6 0 0 0]
 [3 4 5 6 7 0 0 0]
 [4 5 6 9 8 7 6 5]
 [5 6 7 8 9 6 5 4]
 [0 0 0 7 6 5 4 3]
 [0 0 0 6 5 4 3 2]
 [0 0 0 5 4 3 2 1]]
[[1 2 3 0 0]
 [2 3 4 0 0]
 [3 4 5 0 0]
 [0 0 0 0 0]
 [0 0 0 0 0]]
[[1 2 0]
 [2 3 2]
 [0 2 1]]
[[1 2 3 0 0]
 [2 3 4 0 0]
 [3 4 5 4 3]
 [0 0 4 3 2]
 [0 0 3 2 1]]
[[1 2 3 4 5 0 0 0]
 [2 3 4 5 6 0 0 0]
 [3 4 5 6 7 0 0 0]
 [4 5 6 9 8 7 6 5]
 [5 6 7 8 9 6 5 4]
 [0 0 0 7 6 5 4 3]
 [0 0 0 6 5 4 3 2]
 [0 0 0 5 4 3 2 1]]
输入:8

输出:

[[1 2 0]
 [2 3 2]
 [0 2 1]]
[[1 2 3 0 0]
 [2 3 4 0 0]
 [3 4 5 4 3]
 [0 0 4 3 2]
 [0 0 3 2 1]]
[[1 2 3 4 5 0 0 0]
 [2 3 4 5 6 0 0 0]
 [3 4 5 6 7 0 0 0]
 [4 5 6 9 8 7 6 5]
 [5 6 7 8 9 6 5 4]
 [0 0 0 7 6 5 4 3]
 [0 0 0 6 5 4 3 2]
 [0 0 0 5 4 3 2 1]]
[[1 2 3 0 0]
 [2 3 4 0 0]
 [3 4 5 0 0]
 [0 0 0 0 0]
 [0 0 0 0 0]]
[[1 2 0]
 [2 3 2]
 [0 2 1]]
[[1 2 3 0 0]
 [2 3 4 0 0]
 [3 4 5 4 3]
 [0 0 4 3 2]
 [0 0 3 2 1]]
[[1 2 3 4 5 0 0 0]
 [2 3 4 5 6 0 0 0]
 [3 4 5 6 7 0 0 0]
 [4 5 6 9 8 7 6 5]
 [5 6 7 8 9 6 5 4]
 [0 0 0 7 6 5 4 3]
 [0 0 0 6 5 4 3 2]
 [0 0 0 5 4 3 2 1]]

请浏览、和,以了解此网站的工作原理,并帮助您改进当前和未来的问题,从而帮助您获得更好的答案。“演示如何解决此编码问题?”与堆栈溢出无关。您必须诚实地尝试解决方案,然后询问有关实现的特定问题。堆栈溢出不是为了取代现有的教程和文档。哇,我没有想到,将角落镜像到相反的角落似乎是可行的,但是的,我正在研究一种方法,使中间像示例中所示,可能还有另一种模式与(n//2)x(n//2),因为8x8矩阵的中间区域似乎也遵循其自身的模式。