NumPy中asarray函数的参数详解与array/asanyarray区别解析
本文详细解析NumPy中asarray函数的用法,包括输入数据、数据类型和存储顺序等参数。重点对比array、asarray和asanyarray在内存复制、子类处理及copy/subok参数下的行为差异,通过代码实例说明何时生成副本及何时共享内存。
NumPy中asarray的用法
函数说明
asarray(a, dtype=None, order=None)将输入数据转换为数组对象 array。
输入参数
a:类数组。这是输入的原始数据,可以是任何可转换为数组的形式,例如列表、元组列表、元组、元组的元组、列表的元组以及现有的 ndarray 对象;dtype:数据类型,可选参数。若未指定,默认情况下该参数将与输入数据的现有数据类型保持一致。order:{'C','F'},可选。用于指定内存布局是行优先(C-style)还是列优先(Fortran-style)。默认值为行优先。
返回值
out:ndarray。返回输入数据 'a' 的数组形式。如果输入已经是符合 dtype 和 order 参数要求的 ndarray,则不会执行复制操作;若输入是 ndarray 的子类,则返回该子类的基类 ndarray。
实例
将列表转换为数组
>>> a = [1, 2]
>>> np.asarray(a)
array([1, 2])如果输入已经是匹配的数组,则不会进行复制。
>>> a = np.array([1, 2])
>>> np.asarray(a) is a
True当指定了 'dtype' 参数时,仅当输入数据的 dtype 与指定参数不匹配时,才会创建新数组;否则返回原数组引用。
>>> a = np.array([1, 2], dtype=np.float32)
>>> np.asarray(a, dtype=np.float32) is a
True
>>> np.asarray(a, dtype=np.float64) is a
False与 'asanyarray' 不同,'asarray' 不会保留 ndarray 的子类,而是将其转换为基类 ndarray。
>>> issubclass(np.recarray, np.ndarray)
True
>>> a = np.array([(1.0, 2), (3.0, 4)], dtype='f4,i4').view(np.recarray)
>>> np.asarray(a) is a
False
>>> np.asanyarray(a) is a
Truenumpy中array,asarray和asanyarray区别
先讨论默认情况下
1、array和asarray都可以将结构数据转化为ndarray,主要区别在于:当数据源本身已是 ndarray 时,array 会强制 copy 出一个新副本,占用新的内存空间,而 asarray 则不会进行复制,直接返回原数组引用。
也就是说,当数据是 ndarray 时,执行 a = array(b)后,a 和 b 不再占用同一块内存;而在 asarray 中,a 和 b 指向同一内存地址,修改 b 会直接影响 a。
2、asarray和asanyarray的区别在于,np.asanyarray 会返回 ndarray 或其子类(如 matrix),而 np.asarray 仅返回标准的 ndarray。这意味着对于 ndarray 的子类,asanyarray 不会进行复制,而 asarray 会。
array、asarray,asanyarray的区别还受到两个参数控制
即copy和subok,下面具体举例
而array默认设置copy=True
假设a是一个数组,m是一个矩阵,它们的数据类型都是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 是矩阵,它是 ndarray 的子类。- 由于数据类型不兼容,数组(a,dtype=int,copy=False,subok=True)将同时复制两者。
asanyarray:如果输入是兼容的 ndarray 或类似 matrix 的子类(且设置 copy=False,subok=True),则将返回未复制的输入对象。
下面举几个详细的例子
array和asarray的区别
import numpy as np
#example 1:
data1=[[1,1,1],[1,1,1],[1,1,1]]
arr2=np.array(data1)
arr3=np.asarray(data1)
data1[1][1]=2
print 'data1:\n',data1
print 'arr2:\n',arr2
print 'arr3:\n',arr3输出
data1: [[1, 1, 1], [1, 2, 1], [1, 1, 1]] arr2: [[1 1 1] [1 1 1] [1 1 1]] arr3: [[1 1 1] [1 1 1] [1 1 1]]
结论:面对元组数据结构,array和asarray没有区别,都对元数据进行了复制并转化为ndarray。
import numpy as np
#example 2:
arr1=np.ones((3,3))
arr2=np.array(arr1)
arr3=np.asarray(arr1)
arr1[1]=2
print 'arr1:\n',arr1
print 'arr2:\n',arr2
print 'arr3:\n',arr3输出
arr1: [[ 1. 1. 1.] [ 2. 2. 2.] [ 1. 1. 1.]] arr2: [[ 1. 1. 1.] [ 1. 1. 1.] [ 1. 1. 1.]] arr3: [[ 1. 1. 1.] [ 2. 2. 2.] [ 1. 1. 1.]]
结论:当数据源是ndarray时,array会copy出一个副本,占用新的内存,但asarray不会。
asarray和asanyarray的区别例子
issubclass(np.matrix, np.ndarray)
True
a = np.matrix([[1, 2]])
np.asarray(a) is a#返回的不是子类。
False
np.asanyarray(a) is a#np.asanyarray(a)返回是a的子类
True以上为个人经验,希望能给大家一个参考,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













