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
  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值