NumPy的np有什么区别?数组和np.asarray?什么时候我应该使用其中一种而不是另一种?它们似乎产生了相同的输出。
当前回答
由于其他问题都被重定向到这个问题,即asanyarray或其他数组创建例程,因此可能有必要简要总结一下它们各自的功能。
区别主要在于什么时候不加改动地返回输入,而不是创建一个新数组作为副本。
Array提供了各种各样的选项(大多数其他函数都是围绕它的薄包装器),包括用于确定何时复制的标志。一个完整的解释将花费和文档一样长的时间(请参阅数组创建,但简单地,这里有一些例子:
假设a是一个ndarray, m是一个矩阵,它们的dtype都是float32:
Np.array (a)和Np.array (m)将复制两者,因为这是默认行为。 np。数组(a, copy=False)和np。array(m, copy=False)将复制m但不复制a,因为m不是ndarray。 np。数组(a, copy=False, subok=True)和np。array(m, copy=False, subok=True)两者都不会复制,因为m是一个矩阵,是ndarray的子类。 np。array(a, dtype=int, copy=False, subok=True)会同时复制两者,因为dtype不兼容。
大多数其他函数都是数组的薄包装器,用于控制复制发生的时间:
asarray: The input will be returned uncopied iff it's a compatible ndarray (copy=False). asanyarray: The input will be returned uncopied iff it's a compatible ndarray or subclass like matrix (copy=False, subok=True). ascontiguousarray: The input will be returned uncopied iff it's a compatible ndarray in contiguous C order (copy=False, order='C'). asfortranarray: The input will be returned uncopied iff it's a compatible ndarray in contiguous Fortran order (copy=False, order='F'). require: The input will be returned uncopied iff it's compatible with the specified requirements string. copy: The input is always copied. fromiter: The input is treated as an iterable (so, e.g., you can construct an array from an iterator's elements, instead of an object array with the iterator); always copied.
还有一些方便的函数,如asarray_chkfinite(与asarray相同的复制规则,但如果有任何nan或inf值,则会引发ValueError),以及用于子类(如matrix)或特殊情况(如记录数组)的构造函数,当然还有实际的ndarray构造函数(它允许您直接在缓冲区上跨步创建数组)。
其他回答
由于其他问题都被重定向到这个问题,即asanyarray或其他数组创建例程,因此可能有必要简要总结一下它们各自的功能。
区别主要在于什么时候不加改动地返回输入,而不是创建一个新数组作为副本。
Array提供了各种各样的选项(大多数其他函数都是围绕它的薄包装器),包括用于确定何时复制的标志。一个完整的解释将花费和文档一样长的时间(请参阅数组创建,但简单地,这里有一些例子:
假设a是一个ndarray, m是一个矩阵,它们的dtype都是float32:
Np.array (a)和Np.array (m)将复制两者,因为这是默认行为。 np。数组(a, copy=False)和np。array(m, copy=False)将复制m但不复制a,因为m不是ndarray。 np。数组(a, copy=False, subok=True)和np。array(m, copy=False, subok=True)两者都不会复制,因为m是一个矩阵,是ndarray的子类。 np。array(a, dtype=int, copy=False, subok=True)会同时复制两者,因为dtype不兼容。
大多数其他函数都是数组的薄包装器,用于控制复制发生的时间:
asarray: The input will be returned uncopied iff it's a compatible ndarray (copy=False). asanyarray: The input will be returned uncopied iff it's a compatible ndarray or subclass like matrix (copy=False, subok=True). ascontiguousarray: The input will be returned uncopied iff it's a compatible ndarray in contiguous C order (copy=False, order='C'). asfortranarray: The input will be returned uncopied iff it's a compatible ndarray in contiguous Fortran order (copy=False, order='F'). require: The input will be returned uncopied iff it's compatible with the specified requirements string. copy: The input is always copied. fromiter: The input is treated as an iterable (so, e.g., you can construct an array from an iterator's elements, instead of an object array with the iterator); always copied.
还有一些方便的函数,如asarray_chkfinite(与asarray相同的复制规则,但如果有任何nan或inf值,则会引发ValueError),以及用于子类(如matrix)或特殊情况(如记录数组)的构造函数,当然还有实际的ndarray构造函数(它允许您直接在缓冲区上跨步创建数组)。
让我们通过下面的例子来理解np.array()和np.asarray()之间的区别: np.array():将输入数据(列表、元组、数组或其他序列类型)转换为ndarray并默认复制输入数据。 np.asarray():将输入数据转换为ndarray,但如果输入已经是ndarray,则不复制。
#Create an array...
arr = np.ones(5); # array([1., 1., 1., 1., 1.])
#Now I want to modify `arr` with `array` method. Let's see...
arr = np.array(arr)[3] = 200; # array([1., 1., 1., 1., 1.])
数组没有变化,因为我们修改了arr的副本。
现在,使用asarray()方法修改arr。
arr = np.asarray(arr)[3] = 200; # array([1., 200, 1., 1., 1.])
这个数组发生了变化,因为我们现在使用的是原始数组。
asarray(x)类似于array(x, copy=False)
当你想要确保x在任何其他操作完成之前是一个数组时,使用asarray(x)。如果x已经是一个数组,则不会进行复制。它不会导致冗余的性能损失。
下面是一个函数的例子,它确保x首先被转换成一个数组。
def mysum(x):
return np.asarray(x).sum()
这里有一个简单的例子可以说明这种区别。
主要区别是数组会复制原始数据,而使用不同的对象我们可以修改原始数组中的数据。
import numpy as np
a = np.arange(0.0, 10.2, 0.12)
int_cvr = np.asarray(a, dtype = np.int64)
数组(a)中的内容保持不变,并且仍然可以使用另一个对象对数据执行任何操作,而无需修改原始数组中的内容。
这种差异可以通过下面的例子来证明:
Generate a matrix. >>> A = numpy.matrix(numpy.ones((3, 3))) >>> A matrix([[ 1., 1., 1.], [ 1., 1., 1.], [ 1., 1., 1.]]) Use numpy.array to modify A. Doesn't work because you are modifying a copy. >>> numpy.array(A)[2] = 2 >>> A matrix([[ 1., 1., 1.], [ 1., 1., 1.], [ 1., 1., 1.]]) Use numpy.asarray to modify A. It worked because you are modifying A itself. >>> numpy.asarray(A)[2] = 2 >>> A matrix([[ 1., 1., 1.], [ 1., 1., 1.], [ 2., 2., 2.]])
推荐文章
- Python glob多个文件类型
- 如何可靠地打开与当前运行脚本在同一目录下的文件
- Python csv字符串到数组
- 如何在Python中进行热编码?
- 如何嵌入HTML到IPython输出?
- 在Python生成器上使用“send”函数的目的是什么?
- 是否可以将已编译的.pyc文件反编译为.py文件?
- Django模型表单对象的自动创建日期
- 在Python中包装长行
- 如何计算两个时间串之间的时间间隔
- 我如何才能找到一个Python函数的参数的数量?
- 您可以使用生成器函数来做什么?
- 将Python诗歌与Docker集成
- 提取和保存视频帧
- 使用请求包时出现SSL InsecurePlatform错误