【问题标题】:How do I write a 2D-array parameter specification in python如何在 python 中编写二维数组参数规范
【发布时间】:2020-10-29 23:44:12
【问题描述】:

上下文

在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)

问题

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

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

谢谢

【问题讨论】:

    标签: python arrays numpy matrix


    【解决方案1】:

    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
        . . .
    

    【讨论】:

      猜你喜欢
      • 2012-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-04
      • 1970-01-01
      • 2022-12-22
      相关资源
      最近更新 更多