首页 > 解决方案 > 如何在 python 中编写二维数组参数规范

问题描述

语境

在 python 中声明函数时,我不习惯参数规范。

在以下示例中,我们指定参数xy为类型int

def add(x: int, y: int) -> int:
    return x + y

我正在使用 numpy 初始化一个 0 的二维数组,但我不确定如何将二维数组指定为我的参数。这是我所拥有的:

import numpy as np

def fillWithOnes(array: type([[]])) -> None:
    for row in array:
        for i in range(0, len(row)):
            row[i] = 1

table = np.zeros((5,5))

fillWithOnes(table)

print (table)

问题

type([[]])第3行正确吗?我一直无法在 python 的 Typing 文档中找到答案

我还注意到我可以将参数指定array为 anint并且代码仍然有效。这引出了我的第二个问题:纯粹是为第三方工具打字吗?也许一般的理智和可读性也是如此?

谢谢

标签: pythonarraysnumpymatrix

解决方案


np.zeros返回一个ndarray

>>> type(np.zeros((5,5)))
<class 'numpy.ndarray'>

这就是您将其注释为:

def fillWithOnes(array: np.ndarray) -> None:
    . . .

但是,如果您想通用,可以将其注释为协议/基类以允许多种不同类型。您目前只需要“可迭代的整数序列”,因此您可以指定:

from typing import Sequence, Iterable

def fillWithOnes(array: Iterable[Sequence[int]]) -> None:
    pass

现在它可以接受列表、ndarrays,甚至是你定义的类型。


对于列表,我只想type([[]])稍微提一下。它忽略列表的内部类型。它相当于:

def fillWithOnes(array: list) -> None:
    . . .

它指定它是一个列表,但没有说明元素类型。

目前,您需要使用List包装器:

from typing import List

def fillWithOnes(array: List[List[int]]) -> None:  # I'm assuming the cells are ints
    . . .


推荐阅读