python - 如何在 python 中编写二维数组参数规范
问题描述
语境
在 python 中声明函数时,我不习惯参数规范。
在以下示例中,我们指定参数x
和y
为类型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
并且代码仍然有效。这引出了我的第二个问题:纯粹是为第三方工具打字吗?也许一般的理智和可读性也是如此?
谢谢
解决方案
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
现在它可以接受列表、ndarray
s,甚至是你定义的类型。
对于列表,我只想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
. . .
推荐阅读
- ruby-on-rails - 无法将图像解析为 URL:未定义的方法“start_with?” 对于 /\.(?:svg|eot|woff|ttf)$/:Regexp
- reactjs - 反应测试文件是否与 Web 浏览器中的其他文件一起呈现?
- java - 在 Java 中屏蔽字符串的最佳方法是什么?
- android - FFmpeg 无法在 Android 版本 10(Q) 上运行
- javascript - 在 DOMContentLoaded 上的函数 javascript 中声明全局常量
- python - 如何从python执行文件
- ruby - Rspec 期望接收任何作为参数的东西
- r - 有什么方法可以并行化 ggplot 绘图?[R]
- c# - 使用 LibGit2Sharp 查找 sha 提交的正确方法
- ios - 阴影仅在左侧和上侧遮盖到边界。这是什么原因造成的?