关于NumPy中asarray的用法及说明
作者:止步听风
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” 不同,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 True
numpy中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 或者ndarray的子类,而np.asarray 只返回 ndarray. 也就是说对于ndarray的子类,asanyarray是不会复制的。
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
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。