numpy 对于类型提示的目的,np的优点是什么,typing.NDArrray over np.ndarray?

qnakjoqk  于 2023-04-30  发布在  其他
关注(0)|答案(1)|浏览(147)

如果我们检查numpy的源代码,我们会在numpy/__init__中找到。py,ndarray被声明为

class ndarray(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co])

numpy/_typing/_array_like。py,NDArray定义为

NDArray = ndarray[Any, dtype[_ScalarType_co]]

NDArray似乎是ndarray的部分专用版本,这意味着对于ndarray,我们可以写x: ndarray[(2, 2), np.float32] = ...y: ndarray[np.float32] = ...,但对于NDArray,我们只能写z: NDArray[np.float32] = ...,不能添加形状信息。
那么NDArray是必要的吗?

s3fp2yjn

s3fp2yjn1#

这是一种方便。你可以写:

y: ndarray[np.float32] = ...

你也可以**写:

y: "banana" = ...

这将 * 运行 * 刚刚好,但静态分析工具将抱怨 * 两者 *。因为这两个都是正确的类型注解。下面是一个例子,让我们创建一个python脚本test_typing.py

(py311) jarrivillaga-mbp16-2019:~ jarrivillaga$ cat test_typing.py
import numpy as np
import numpy.typing as npt

arr: np.ndarray[np.float64] = np.array([1,2,3],dtype=np.float64)
arr2:  npt.NDArray[np.float64] = np.array([1,2,3], dtype=np.float64)

现在,让我们看看mypy的感受:

(py311) jarrivillaga-mbp16-2019:~ jarrivillaga$ mypy test_typing.py
test_typing.py:4: error: "ndarray" expects 2 type arguments, but 1 given  [type-arg]
Found 1 error in 1 file (checked 1 source file)

因此,正如您所看到的,它接受了第二个,但没有接受第一个,因为第一个不是有效的注解。
为了更好地衡量,pyright(另一个非常流行的静态类型检查器)也抱怨:

(py311) jarrivillaga-mbp16-2019:~ jarrivillaga$ pyright test_typing.py
No configuration file found.
No pyproject.toml file found.
Assuming Python platform Darwin
Searching for source files
Found 1 source file
pyright 1.1.304
/Users/jarrivillaga/test_typing.py
  /Users/jarrivillaga/test_typing.py:4:17 - error: Too few type arguments provided for "ndarray"; expected 2 but received 1 (reportGeneralTypeIssues)
1 error, 0 warnings, 0 informations
Completed in 1.397sec

相关问题