问题描述
Python 3.8,Numpy 1.18.1
代码中有一行
L = H.flatten(0)
这很麻烦,引发以下错误,
ValueError:检测到非字符串对象,用于数组排序。请 改用“ C”,“ F”,“ A”或“ K”
现在我将行更改为
L = H.flatten('C')
并且代码可以正常运行,不幸的是,如果我将其更改为,代码也可以正常运行(但结果不同)
L = H.flatten('F')
我的工作假设是,最初的意图是行优先(C风格),因为HPC以外的人很少使用Fortran。
我想确定,到目前为止,我的搜索还没有发现任何东西。
那么,numpy在使用时 numpy的flatten(0)会做什么?
解决方法
我假设您正在谈论的是调用flatten()时默认的订单选项是什么?
如果是这样,则是,则默认情况下,在不带任何参数的情况下调用flatten()时,默认情况下等效地调用flatten('C')。您可以在此处看到它的记录
https://numpy.org/devdocs/reference/generated/numpy.ndarray.flatten.html
默认为row-major(C样式)的实现返回numpy1.8
之前的任何版本,您都必须手动指定要在参数输入中展平行还是列。
对于为什么flatten('C')是默认值,我认为没有任何详尽的理由。只是为了简化。
如果要说明为什么flatten(0)不起作用,那仅仅是因为flatten不接受文档中指定的选项“ C”,“ F”,“ A”,“ K”之外的任何其他输入
编辑 对不起,我误解了这个问题 numpy.ndarray.flatten()只是C PyArray_Flatten的别名,可在此处找到
https://github.com/numpy/numpy/blob/v1.18.1/numpy/core/src/multiarray/shape.c