Answers:
由于将其他问题重定向到这个询问问题asanyarray或其他数组创建例程的问题,因此可能有必要简要概述每个问题的作法。
区别主要在于何时返回不变的输入,而不是将新数组作为副本。
array提供了多种选择(大多数其他功能都是围绕它的薄包装器),包括用于确定何时复制的标志。完整的解释将和文档一样长(请参阅Array Creation,但是简要地,这里有一些示例:
假设a是ndarray,并且m是matrix,并且它们都具有dtype的float32:
np.array(a)并且np.array(m)将复制两个,因为这是默认行为。np.array(a, copy=False)并且np.array(m, copy=False)将复制m但不复制a,因为m不是ndarray。np.array(a, copy=False, subok=True),并且np.array(m, copy=False, subok=True)不会复制任何内容,因为m是matrix,这是的子类ndarray。np.array(a, dtype=int, copy=False, subok=True)将同时复制两者,因为与dtype不兼容。其他大多数功能都是array在复制发生时围绕该控件的薄包装器:
asarray:如果兼容ndarray(copy=False),则输入将返回未复制的状态。asanyarray:如果输入是兼容的ndarray或子类matrix(如copy=False,subok=True),则输入将不被复制。ascontiguousarray:如果输入是兼容ndarray的连续C顺序(copy=False,,则将返回未复制的输入order='C')。asfortranarray:如果输入与ndarray连续的Fortran顺序(copy=False,order='F')兼容,则将返回未复制的输入。require:如果输入与指定的需求字符串兼容,则输入将不复制而返回。copy:总是复制输入。fromiter:输入被视为可迭代的(例如,您可以从迭代器的元素构造数组,而不是object使用迭代器的数组);始终复制。还有一些便利功能,例如asarray_chkfinite(与复制规则相同asarray,但复制规则与相同,但是ValueError如果有nan或inf值,则会提高),以及子类的构造函数(例如matrix或特殊情况下的记录数组),当然还有实际的ndarray构造函数(可让您直接创建数组)超出缓冲区)。
的定义asarray是:
def asarray(a, dtype=None, order=None):
return array(a, dtype, copy=False, order=order)
就像array,除了它的选项更少,和copy=False。array有copy=True默认。
主要区别在于array(默认情况下)将复制对象,而asarray除非有必要,否则不会复制。
array([1, 2, 3])还是asarray([1, 2, 3])?
[1, 2, 3]是Python列表,因此必须创建数据的副本才能创建ndarary。因此,np.array直接使用代替np.asarray将copy=False参数发送到np.array。该copy=False如果一个副本必须做,因为这将是在这种情况下被忽略。如果您%timeit在IPython中使用这两种方法进行基准测试,您会发现小列表有所不同,但大列表几乎没有关系。
np.asanyarray?
asarray始终返回ndarray。asanyarray将返回ndarrayif 的子类。例如,an np.matrix是的子类ndarray。因此,np.asanyarray(np.matrix(...))返回相同的矩阵,而np.asarray(np.matrix(...))将矩阵转换为ndarray。
可以通过以下示例证明差异:
产生矩阵
>>> A = numpy.matrix(numpy.ones((3,3)))
>>> A
matrix([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.]])用于numpy.array修改A。不起作用,因为您正在修改副本
>>> numpy.array(A)[2]=2
>>> A
matrix([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.]])用于numpy.asarray修改A。之所以有效,是因为您正在修改A自己
>>> numpy.asarray(A)[2]=2
>>> A
matrix([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 2., 2., 2.]])希望这可以帮助!
array和的文档中非常清楚地提到了差异asarray。不同之处在于参数列表,因此取决于这些参数的功能作用。
函数定义为:
numpy.array(object, dtype=None, copy=True, order=None, subok=False, ndmin=0)
和
numpy.asarray(a, dtype=None, order=None)
以下参数是可能传递给文档的参数,array而不是 asarray文档中提到的参数:
copy:bool,可选如果为true(默认),则复制对象。否则,仅当
__array__返回一个副本,obj是一个嵌套序列或需要一个副本以满足其他任何要求(dtype,order等)时,才创建副本。subok:bool,可选如果为True,则子类将被传递,否则返回的数组将被强制为基类数组(默认)。
ndmin:int,可选指定结果数组应具有的最小维数。可以根据需要预先添加形状。